预处理器 C 宏语法

Pre-Processor C Macro Syntax

我正在尝试理解预处理器语法。 returns "ON" 或 "OFF" 的代码行非常简单。但是,我完全不知道具体情况是什么?

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

? x : y

如果条件? return - 替换? x : or y 这行代码如下:

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

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

在这里添加一点上下文,条件运算符的第一个操作数必须是标量类型。现在,从第 6.2.5 章开始,C11

Arithmetic types and pointer types are collectively called scalar types.

因此,对于条件表达式,

  • 任何非零值都被评估为 TRUE,零 (0) 被评估为 FALSE。
  • (在指针的情况下)a NULL 为 FALSE,任何非 NULL 为 TRUE。

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

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

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

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

如果 astructvoid 类型,您将遇到编译错误。

预处理器宏执行 文本替换,因此 a 不是变量 - 它只是当宏为 [= 时括号中的任何文本的占位符19=]用过.

您可以像这样使用它来检查指针是否为空:

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));

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

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

你这里的条件是(a),即true如果a的值不为零,如果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