我正在尝试对一个结构数组实现编译时检查,以确保将来有人更改它时,数组的每个元素都被定义。我想避免有人在结构数组中添加太多元素的情况,如果我显式设置数组大小,这是可能的。这不包括这样的情况:有人定义的数组元素太少,而其余的元素只是初始化为零。
#include <stdio.h>
typedef struct myStruct {
int a;
int b;
} myStruct_t;
#define ARRAY_SIZE (3)
myStruct_t sArr[] = {
{0, 0},
{1, 1},
{2, 2}
}
#define RATIO (sizeof(sArr) / sizeof(myStruct_t))
#if ARRAY_SIZE != RATIO
#error API issue
#endif
int main(void) {
printf("Testing\n");
return 0;
}
这看起来像是一个声音检查,因为
sizeof()
是在编译时计算的。但是编译器报告说:test.c:15:12: error: missing binary operator before token "("
test.c:19: error: expected ',' or ';' before 'int'
如果可能的话,我如何实施这种检查?
谢谢您。
最佳答案
必须使用预处理阶段之后的编译器特性。
C11有:
_Static_assert(ARRAY_SIZE == RATIO);
这将是最干净的解决方案。如果你没有这些,你可以使用像
typedef char something_useless[ARRAY_SIZE == RATIO];
如果比较结果为
_Static_assert
,则这是一个有效的1
,它将不起任何作用。如果小于cc>则会发生错误(约束冲突)。