我想为我正在开发的库定义一个编译时输入有效性检查器。所以我想也许#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/

10-11 22:59
查看更多