预处理器C宏语法

Pre-Processor C Macro Syntax

我试图理解预处理器语法。它实际上是一行简单的代码,返回"on"或"off"。然而,我完全搞不清楚到底是什么情况?

我理解C的条件陈述如下:

1
? x : y

如果条件?退货-更换?X:或Y,无论哪种方式,这行代码如下:

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

我不明白这里必须满足什么条件?条件A必须是非空的吗?


trueFlase可以更完美地表示为10。如我所见,你已经宣布

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

你这里的条件是(a),如果a的值不为零,则为istrue;如果a的值为0,则为假。

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

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

发生的替换是

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

因为这里,a11为真,str取ON的值。如果a为0,那么str将得到OFF的值。


预处理器宏进行文本替换,所以a不是一个变量——它只是一个占位符,当使用宏时,不管括号中的文本是什么。

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

1
2
3
4
printf("%s
"
, ONOFF(ptr));
printf("%s
"
, ONOFF(ptr != null));  // This is the same

或者其他你喜欢的情况:

1
2
3
4
5
6
7
8
9
10
11
12
printf("%s
"
, ONOFF(a > b));
printf("%s
"
, ONOFF(a && b));
printf("%s
"
, ONOFF(a == 1 || c == 4));
printf("%s
"
, ONOFF(somefunction() != 0));
printf("%s
"
, ONOFF((a == b && c == d) || (a == c && b == d));
printf("%s
"
, ONOFF(my_bool_value));


条件是a必须对true进行评估。在C语言中,这意味着a必须是非零的表达式。

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

如果a为整数类型,则0false,其他值为true

如果a为浮点型,则0false,其他值为true

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


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

Arithmetic types and pointer types are collectively called scalar types.

所以,对于条件表达式,

  • 任何非零值都将被计算为真,而零(0则被计算为假。
  • (对于指针)NULL为假,任何非NULL为真。