预处理器C宏语法

时间:2016-05-19 11:31:37

标签: c macros c-preprocessor conditional-operator

我试图理解预处理器语法。它非常简单的代码行返回“ON”或“OFF”。但是我完全混淆了条件是什么?

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

<p>​<span rtenodeid="3" id="ms-rterangecursor-start"></span><span id="ms-rterangecursor-end"></span><span id="ms-rterangepaste-start"></span><span id="ms-rterangepaste-end"></span></p><div style="width: 1px; height: 1px; overflow: hidden;" class="ms-rte-pasteremove" contenteditable="true"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW4AAACOCAIAAACe83XuAAACHklEQVR4nO3c0QnCUAxA0S7uIo6gQ+pfBkgvtOI5ZIOUS6Dwjg/cw5vbWKzvyD8I4A9JCRCQEiAgJUBASoCAlAABKQECx9U/sH/b1euDu3CV7EkJDCnZkxIYUrInJTCkZE9KYEjJnpTAkJI9KYEhJXtSAkNK9qQEhpTsSQkMKdmTEhhSsiclMKRkT0pgSMmelMCQkj0pgSEle1ICQ0r2pASGlOxJCQwp2ZMSGB5kPOXq9cFduEqAgJQAASkBAlICBKQECEgJEJASICAlQEBKgICUAAEpAQJSAgSkBAhICRCQEiAgJUBASoCAlAABKQECUgIEpAQISAkQkBIgICVAQEqAgJQAASkBAlICBKQECEgJEJASICAlQEBKgICUAAEpAQJSAgSkBAhICRCQEiAgJUBASoCAlAABKQECUgIEpAQIHI/nyxhjTo6rBAhICRCQEiAgJUBASoCAlAABKQECUgIEpAQISAkQkBIgICVAQEqAgJQAASkBAlICBKQECEgJEJASICAlQEBKgICUAAEpAQJSAgSkBAhICRCQEiAgJUBASoCAlAABKQECUgIEpAQISAkQkBIgICVAQEqAgJQAASkBAlICBKQECEgJEJASICAlQEBKgICUAAEpAQJSAgSkBAhICRCQEiAgJUBASoCAlAABKQECUgIEpAQISAkQkBIgICVAQEqAgJQAASkBAlICBKQECEgJEJASICAlQOAL8yemKmwohB0AAAAASUVORK5CYII=" alt=""></div>

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

? x : y

我不明白这里必须满足什么条件?条件是a必须是null以外的其他东西吗?

4 个答案:

答案 0 :(得分:1)

TrueFlase可以更完美地呈现为10。我可以看到你宣布了

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

此处的条件为(a),如果true的值非零,则为a,如果a为0则为false

如果你写了

,那么在你的程序中意味着什么
int a=1; 
char *str;
str=ONOFF(a);

发生的替换是

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

此处a1和。{ 1为true,str获取值ON。如果a为0,则str将获得值OFF

答案 1 :(得分:0)

要在此处添加一些上下文,条件操作符的第一个操作数必须是标量类型。现在,从章节§6.2.5开始,C11

  

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

因此,对于条件表达式,

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

答案 2 :(得分:0)

条件是a必须评估为true。在c中,这意味着a必须是非零的表达式。

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

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

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

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

答案 3 :(得分:0)

预处理器宏执行文本替换,因此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));