序言:我想静态检查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语言的原始目标?
在C中,即使使用const定义的变量也不是常量表达式。_Static_assert要求其第一个参数为常量表达式。因此,用C ++可以完成的同一件事不能用C来完成。
您可以改为进行运行时检查。使用断言。
请注意,此方法不能防止程序员在同一行中键入两个成员,或使用相同类型的多个单行声明,或添加空行(或注释)。而不是强迫程序员遵循字符串编码模式,只是为了使该断言捕获错误,只需要程序员定义正确数目的成员就不会出现错误。严格来说,这是更好的选择,因为您可以通过任何一种方式都可以检测到无法检测到的错误,但至少不必担心严格的编码模式。
| 归档时间: |
|
| 查看次数: |
704 次 |
| 最近记录: |