【问题标题】:How to use a global variable in #if conditional check?如何在#if 条件检查中使用全局变量?
【发布时间】:2021-02-11 08:04:35
【问题描述】:
#define TEST
int i = 1;

int main(int argc, char const *argv[]) {
#if (defined(TEST) && i) 
    printf("it is printed");
#endif
    return 0;
}

我必须为i 创建另一个宏吗?

【问题讨论】:

  • 你不能。预处理器指令在编译时评估,变量在那个时候不可用。
  • "我必须为 i 创建另一个宏吗?"是的。 i 需要是最终解析为预处理器整数常量的宏,才能在 #if 条件句中使用。
  • 你能用if (i)代替把它放在宏里吗?
  • 您需要解决的实际问题是什么?这个问题背后的原因是什么?现在这是XY problem

标签: c if-statement macros conditional-statements


【解决方案1】:

如果您想要输出当且仅当宏和全局变量上的条件都为真时,请执行以下操作:

#if (defined(TEST)) 
if (i)
{    printf("it is printed");
}
#endif

原因(同意 Barmar 的评论):

预处理器指令在编译时进行评估,此时变量不可用。

【讨论】:

  • 在实际的 C 代码编译之前完成预处理
  • @P__J__ 是的。你想说啥?您想讨论预处理器时间和编译时间之间的(理论)差异吗?
【解决方案2】:

与 cmets 一样,宏定义在预处理阶段,在实际 C 代码编译之前进行扩展。

但是为什么这段代码会编译,它的结果是什么。

#if (defined(TEST) && i)
  1. 预处理器测试宏定义TEST。正如它所定义的,这个检查的结果是true
  2. 现在预处理器正在检查 宏定义(不是 C 变量!)i 是否存在。因为它没有,#if 中的整个表达式被评估为false

一般:

#if a

检查宏定义a是否存在,然后检查其值是否为!= 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多