序言:我想在 C程序中静态检查结构成员的数量,因此我创建了两个宏,每个宏创建常量int存储__LINE__
到变量中:
#include <stdio.h> #include <string.h> #define BEGIN(log) const int __##log##_begin = __LINE__; #define END(log) const int __##log##_end = __LINE__; BEGIN(TEST); struct TEST { int t1; int t2; float t3; int t4; int t5; int t6; }; END(TEST) main() { static_assert(__TEST_end - __TEST_begin == 6 + 3, "not_equal"); }
当我使用带有-std = c ++ 11选项的C ++编译器(c ++ test.cpp -std = c ++ 11)时,它工作正常,但是相同的代码(将static_assert替换为_Static_assert)并没有#39 ; t在C(gcc版本4.8.4)中工作时出现一个奇怪的错误,因为这个表达式可以在编译时进行评估:
test.c:在函数'main'中:test.c:18:17:error:表达式为static 断言不是常量_Static_assert(__ TEST_end - __TEST_begin == 6 + 4,&#34; not_equal&#34;);
如何修复此错误或在C中实现原始目标?
答案 0 :(得分:5)
在C中,即使用const定义的变量也不是常量表达式。 _Static_assert要求其第一个参数是常量表达式。因此,在C中无法完成同样的事情。
您可以执行运行时检查;使用断言。
请注意,此方法不会阻止程序员在同一行中键入两个成员或使用相同类型的多个单行声明,或添加空行(或注释)。而不是强迫程序员遵循字符串编码模式,只是为了使这个断言能够捕获错误,而不是简单地要求程序员定义正确数量的成员。这是更好的,因为你可以在任何一种情况下做出无法察觉的错误,但至少不必担心严格的编码模式。