我有一个在编译时初始化的非常大的常量数组。
typedef enum {
VALUE_A, VALUE_B,...,VALUE_GGF
} VALUES;
const int arr[VALUE_GGF+1] = { VALUE_A, VALUE_B, ... ,VALUE_GGF};
我想验证数组是否已正确初始化,例如:
if (arr[VALUE_GGF] != VALUE_GGF) {
printf("Error occurred. arr[VALUE_GGF]=%d\n", arr[VALUE_GGF]);
exit(1);
}
我的问题是我想在编译时验证这一点。我在这个线程中阅读了 C 中的编译时断言:C Compiler asserts。但是,那里提供的解决方案建议使用负值定义一个数组作为编译错误的大小:
#define CASSERT(predicate, file) _impl_CASSERT_LINE(predicate,__LINE__,file)
#define _impl_PASTE(a,b) a##b
#define _impl_CASSERT_LINE(predicate, line, file) \
typedef char _impl_PASTE(assertion_failed_##file##_,line)[2*!!(predicate)-1];
并使用:
CASSERT(sizeof(struct foo) == 76, demo_c);
提供的解决方案对我不起作用,因为我需要验证我的常量数组值,并且 C 不允许使用常量数组值初始化数组:
int main() {
const int i = 8;
int b[i]; //OK in C++
int b[arr[0]]; //C2057 Error in VS2005
有什么办法吗?其他一些编译时断言?