Linux嵌入式 Linux C ARM C语言

GNU C语法扩展(3)

2019-02-17  本文已影响1人  Leon_Geo

要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特性对于我们分析内核有着很重要的作用,下面做些总结性的工作。

3 变参宏

标准C的变参宏

#define  debug(format, …)  fprintf(stderr, format, __VA_ARGS__)

但是这样的宏不能处理零变参的情况,否则编译不会通过,因为零变参的时候会多一个逗号。

GCC的变参宏

#define  debug(format, args…)  fprintf(stderr, format, args)

args跟后面的三个点可以连在一起,也可以用空格分开,当然这个宏同样不支持零变参的情形,原因同上。

GNU C的变参宏

#define debug(format,…) fprintf(stderr, format,  ##__VA_ARGS__)

或者

#define  debug(format, args…)  fprintf(stderr, format, ##args)

这样,当我们省略变参的时候黏贴符能自动清除前面多余的逗号。

#define prt(n) printf("calculate i'n: "  "i"#n  " = %d, with parameter %d/n",  i##n, n)

int i = 1;
int i8 = 800, i9 = 900;
prt(8); prt(9);

执行的结果如下:

calculate i'n: i8 = 800, with parameter 8
calculate i'n: i9 = 900, with parameter 9

总结:在上面的例子中:

#define prt(n) printf("calculate i'n: "  "i"#n  " = %d\n",  i##n)

故意在四个地方都用到了标识符n(那个转义换行符'/n'不在讨论范围内),依次分析是:
1. 在字符串中直接出现的“宏参数”实际上并不会被当成参数,而是一个普通的字符n;
2. 如果要解决第一个问题,那就要在字符串当中使用一个井号 # 来黏贴宏参数;
3. 不在字符串当中,要黏贴宏参数,则需要两个井号 ## 来黏贴;
4. 不在字符串中,如果直接出现宏参数,则预处理器将进行宏展开。

我有好茶,你有好书吗?
上一篇 下一篇

猜你喜欢

热点阅读