如何在_Static_assert中使用const int?

Sci*_*pio 3 c gcc c11

序言:我想静态检查C程序中struct成员的数量,所以我创建了两个宏,每个宏都将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");
 }
Run Code Online (Sandbox Code Playgroud)

当我将C ++编译器与-std = c ++ 11选项一起使用时(c ++ test.cpp -std = c ++ 11),它可以正常工作,但是相同的代码(将static_assert替换为_Static_assert)在C语言中不起作用(gcc版本4.8.4),但有一个奇怪的错误,因为此表达式可以在编译时求值:

test.c:在函数“ main”中:test.c:18:17:错误:静态断言中的表达式不是常量_Static_assert(__ TEST_end-__TEST_begin == 6 + 4,“ not_equal”);

如何解决此错误或达到C语言的原始目标?

thi*_*his 5

在C中,即使使用const定义的变量也不是常量表达式。_Static_assert要求其第一个参数为常量表达式。因此,用C ++可以完成的同一件事不能用C来完成。

您可以改为进行运行时检查。使用断言。

请注意,此方法不能防止程序员在同一行中键入两个成员,或使用相同类型的多个单行声明,或添加空行(或注释)。而不是强迫程序员遵循字符串编码模式,只是为了使该断言捕获错误,只需要程序员定义正确数目的成员就不会出现错误。严格来说,这是更好的选择,因为您可以通过任何一种方式都可以检测到无法检测到的错误,但至少不必担心严格的编码模式。