我正在尝试对一个结构数组实现编译时检查,以确保将来有人更改它时,数组的每个元素都被定义。我想避免有人在结构数组中添加太多元素的情况,如果我显式设置数组大小,这是可能的。这不包括这样的情况:有人定义的数组元素太少,而其余的元素只是初始化为零。

#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>则会发生错误(约束冲突)。

09-06 07:00
查看更多