我想为我正在开发的库定义一个编译时输入有效性检查器。所以我想也许#define一个将要用GCC编译的#if预处理器之类的函数,链接如下:
#define VALIDITY_CHECK(x) {#if (x)>10
#error "input out of range"
#endif}
但这是行不通的。那么编写这种编译时间有效性检查器的正确方法是什么?
最佳答案
如果不满足条件,则可以使用一种技巧来引发编译时错误:
#define ASSERT(condition) (sizeof (struct { int:-!(condition); }))
#define x1 23
#define x2 42
void f(void) {
ASSERT(x1 < 31);
ASSERT(x1 > 31);
ASSERT(x2 < 31);
ASSERT(x2 > 31);
}
通过
!
运算符将条件评估为false
为1,true
为0来工作。此数字用于在struct
中声明大小分别为-1或0的匿名位字段。匿名结构仅用于sizeof
运算符,结果将作为未使用的表达式丢弃。由于不允许负位字段大小,因此如果不满足条件,则编译器将输出诊断消息。
如果满足该条件,则编译器将愉快地优化未使用的表达式,并且不会为该行生成任何代码。
如有必要,您可以在
ASSERT()
后面添加注释。诊断消息将显示它。 ASSERT(x1 < 31); // Bla bla bla
关于c - 在C中定义#if预处理条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59729680/