【发布时间】:2015-07-18 18:22:10
【问题描述】:
这是代码,
#include<stdio.h>
#include<stdbool.h>
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
struct my_struct {
int a, b;
// char c;
};
int main() {
bool cond = 1;
BUILD_BUG_ON((sizeof(struct my_struct) % 8) != 0);
BUILD_BUG_ON(cond);
return 0;
}
如果结构体 sizeof 不等于 8,则首次使用 BUILD_BUG_ON(condition) 宏会引发编译错误,因为条件将评估为真。但是即使我提供了真实的条件,第二次使用宏也不会引发编译错误。我无法理解这种行为。谁能解释一下?
【问题讨论】:
-
似乎条件需要是编译时常量表达式才能使该错误“起作用”。
-
printf("%ld\n", sizeof(char[1 - 2 * !!(cond)]));给出-1。我不知道这是可能的。 -
此外,当条件动态为真时,此代码只是具有未定义的行为,因为可变长度数组的大小必须大于零(参见 6.7.6.2/5)。
-
您似乎忽略了 BUILD_BUG_ON 和普通 assert() 之间的区别。
标签: c