gpt4 book ai didi

c - 在 C 中定义 #if 预处理器条件

转载 作者:行者123 更新时间:2023-11-30 14:32:39 24 4
gpt4 key购买 nike

我想为我正在开发的库定义一个编译时输入有效性检查器。所以我想也许 #define 一个像 C 中的 #if 预处理器这样的函数,它将用 GCC 编译,链接如下:

#define VALIDITY_CHECK(x) {#if (x)>10
#error "input out of range"
#endif}

但是这不起作用。那么编写这样的编译时有效性检查器的正确方法是什么?

最佳答案

如果不满足条件,您可以使用引发编译时错误的技巧:

#define ASSERT(condition) (void)(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);
}

它的工作原理是通过 ! 运算符将条件评估为 1 表示 false 和 0 表示 true。该数字用于在 struct 中分别声明大小为 -1 或 0 的匿名位字段。匿名结构仅用于 sizeof 运算符,结果将作为未使用的表达式被丢弃。

由于不允许使用负位域大小,因此如果不满足条件,编译器将输出诊断消息。

如果满足条件,编译器将很乐意优化未使用的表达式,并且不会为该行生成任何代码。

如果需要,您可以通过后面的注释来扩充 ASSERT()。诊断消息将显示它。

    ASSERT(x1 < 31); // Bla bla bla

关于c - 在 C 中定义 #if 预处理器条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59729680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com