- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
序言:我想静态检查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)没有在 C(gcc 版本 4.8.4)中工作时出现奇怪的错误,因为可以在编译时评估此表达式:
test.c: In function ‘main’: test.c:18:17: error: expression in static assertion is not constant _Static_assert(__TEST_end - __TEST_begin == 6 + 4, "not_equal");
如何修复此错误或在 C 中实现最初的目标?
最佳答案
在 C 中,即使用 const 定义的变量也不是常量表达式。 _Static_assert 要求它的第一个参数是常量表达式。因此,在 C++ 中可以完成的事情不能在 C 中完成。
您可以改为执行运行时检查;使用断言。
请注意,此方法不会防止程序员在同一行中键入两个成员或使用同一类型的多个单行声明,或添加空行(或注释)。与其强制程序员遵循字符串编码模式,只是为了让这个断言能够捕获错误,不如简单地要求程序员定义正确数量的成员,这样就不太容易出错。它绝对更好,因为您可以通过任何一种方式产生无法检测的错误,但至少不必担心严格的编码模式。
关于c - 如何在_Static_assert 中使用const int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33806420/
我是一名优秀的程序员,十分优秀!