【发布时间】:2009-11-08 08:25:24
【问题描述】:
我有一个在编译时初始化的非常大的常量数组。
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
有什么办法可以解决吗?其他一些编译时断言?
【问题讨论】:
-
const int x = arr[0];有效吗?我认为问题不在于使用arr[0]作为数组大小,而是在编译时尝试使用arr数组中的值,无论出于何种目的。在这种情况下,您不能对数组内容进行静态断言。 -
编译没有错误: const int arr[2] = {1,2}; const int x = arr[0];
-
您能否澄清为什么您不想通过一个测试来执行此操作,您将切断
main函数并将其替换为一个检查断言的函数?您想要检查的属性是否与您的示例一样明显,可能是为了检查编译器的一致性,就像您的示例中一样?我想建议一个处理用户属性的静态分析工具,但如果你检查的是编译器,这将无济于事。 -
@Pascal- 我不想创建另一个测试并替换主函数,因为我不会消除程序员\QA 工程师忘记运行这个测试和应用程序将被发送给带有错误的客户。编译时错误将迫使程序员验证他的代码。关于检查编译器——这不是我的意图。
标签: c arrays assert static-assert