【问题标题】:Pre-Processor C Macro Syntax预处理器 C 宏语法
【发布时间】:2025-12-06 14:15:03
【问题描述】:

我正在尝试理解预处理器的语法。它非常简单的代码行返回“ON”或“OFF”。但是我完全不知道究竟是什么条件?

我理解C的条件语句如下:

? x : y

如果条件?返回 - 替换? x : 或 y 这行代码如下:

#define ONOFF(a) ((a) ? "ON" : "OFF")

我不明白这里必须满足什么条件?条件是 a 必须不是 null 吗?

【问题讨论】:

  • “陈述”是指“表达”吗?这是两个非常不同的东西。
  • 就像您可以在 C++ 语法中编写 if(a) 一样 - 这意味着 a 必须是 truthy。 Falsy 将只有 false0NULL(类似于 (void*)0)。
  • 第一个操作数的类型与第二个和第三个操作数的类型无关。

标签: c macros c-preprocessor conditional-operator


【解决方案1】:

TrueFlase 可以更完美地呈现为 10 。如我所见,您已声明

#define ONOFF(a) ((a) ? "ON" : "OFF")

这里的条件是(a),如果a 的值不为零,则为true,如果a 为0,则为假

这意味着在你的程序中,如果你写

int a=1; 
char *str;
str=ONOFF(a);

发生的替换是

 int a=1;  
 char *str;
 str=((a) ? "ON" : "OFF")// here a=1

因为这里 a1 并且 1 为真,str 获取值 ON。如果 a 为 0,则 str 将获得值 OFF

【讨论】:

    【解决方案2】:

    条件是a 必须计算为true。在 c 中,这意味着a 必须是一个非零的表达式。

    如果a 是指针类型,则NULLfalse,任何其他值都是true

    如果a 是整数类型,则0false,任何其他值都是true

    如果a 是浮点类型,则0false,任何其他值都是true

    如果astructvoid 类型,则会出现编译错误。

    【讨论】:

      【解决方案3】:

      要在此处添加一些上下文,条件运算符的第一个操作数必须是标量类型。现在,来自C11 的第 6.2.5 章,

      算术类型和指针类型统称为标量类型

      所以,对于条件表达式,

      • 任何非零值都被评估为 TRUE,而零 (0) 被评估为 FALSE。
      • (如果是指针)NULL 为 FALSE,任何非NULL 为 TRUE。

      【讨论】:

        【解决方案4】:

        预处理器宏执行文本替换,因此a 不是变量——它只是宏被使用时括号中的任何文本的占位符。

        您可以使用它来检查指针是否为空,如下所示:

        printf("%s\n", ONOFF(ptr));
        printf("%s\n", ONOFF(ptr != null));  // This is the same
        

        或您喜欢的任何其他类型的条件:

        printf("%s\n", ONOFF(a > b));
        printf("%s\n", ONOFF(a && b));
        printf("%s\n", ONOFF(a == 1 || c == 4));
        printf("%s\n", ONOFF(somefunction() != 0));
        printf("%s\n", ONOFF((a == b && c == d) || (a == c && b == d));
        printf("%s\n", ONOFF(my_bool_value));
        

        【讨论】: