【发布时间】:2013-10-24 13:21:36
【问题描述】:
如果sizeof (struct Astruct) 不均匀,有什么方法可以让编译器退出?
背景资料: 我们有一个 16 位微处理器,如果 16 位值未对齐,它将给出处理器对齐错误。这可能发生在以下情况:
typedef struct
{
U8BIT u8BitValue1;
U8BIT u8BitValue2;
U8BIT u8BitValue3;
} unevenAmountOf8BitValues;
typedef struct
{
U16BIT u16BitValue1;
U16BIT u16BitValue2;
} my16BitValues;
#define U8BIT_COUNT 3
#define U16BIT_COUNT 2
typedef struct
{
unevenAmountOf8BitValues u8BitValues;
my16BitValues u16BitValues;
} valuesCombined;
typedef union
{
valuesCombined myValues;
U8BIT buffer[sizeof(valuesCombined)];
struct
{
U8BIT bufferU8[U8BIT_COUNT];
U16BIT bufferU16[U16BIT_COUNT]; /* <<-- missalignment */
} valuesPerType;
} myValuesInRamAndRom
我们现在要做的是手动计算 U8BIT/U16BIT/U32BIT 值的数量(嗯,使用 excel 跟踪数量)并将其放入 U(8/16/32)BIT_COUNT 定义中,然后执行以下操作:
#if U8BIT_COUNT % 2 == 1
#error The number of U8BIT parameters need to be even, add a dummy
#endif
跟踪 U8-/U16-/U32BIT 值的数量很容易出错,我们有相当多的时间在想“嘿,它不工作”,一个小时或之后,哦!该死,忘了调整定义的值的数量。
一种首选方法是使用 sizeof 运算符,但它不能用于错误检查,我真的很想保留它。
那么无论如何要使用 sizeof 运算符 and 来保持某种形式的错误检查,以确保 U8BIT 值的数量必须是偶数?
Lundin 和 Aaron McDaid 的组合解决方案:
#define COMPILE_TIME_ASSERT(expr) {typedef U8BIT COMP_TIME_ASSERT[((!!(expr))*2-1)];}
【问题讨论】:
-
如果错位总是出现在单个结构中,请编写一个单独的 perl/python/bash(?) 脚本,该脚本将对其进行检查并将其放入您的
Makefile。 -
@Dariusz 可能需要注意,我们使用的是富士通 Softune 编译器,所以没有方便的花花公子
Makefilemumbo-jumbo。更准确地说:FFMC-16 Family Softune Workbench V30L29 -
@Dariusz 我更喜欢不使用像 perl/python/bash 这样的外部工具,因为我是这家公司中唯一一个除了 C 之外什么都懂的人(Python,耶!)。我是一个外来人员,一两个月后就要离开这里。所以我更喜欢在 C 中工作的东西,如果可能的话。
-
@DaanTimmer C++ 怎么样?你能用那个吗?那时可以使用
static_assert。 -
@H2CO3 这在 C 中也是可能的,从 C11 开始。
标签: c