深入理解C语言中宏定义

从本质上看,C语言中的宏定义实现的是一个文本替换的功能,似乎很简单的样子,然而这几天去看了下Linux Kernel源码中的各种宏定义,才发现一个宏定义竟然也可以有如此多的奇技淫巧……于是花了一天时间仔细研究了下宏的相关知识,此处整理总结下。

C语言中的字符串字面量连接

字符串字面量(string literal)就是程序代码中出现的"包围的字符串,比如"hello", "I Love C Language!"这类的。在C语言中,有一个奇技淫巧:两个相邻的字符串字面量会自动被合并连接为一个。这里的相邻可以是直接连在一起,也可以是间隔着若干个空白字符。需要指出的是,这个特性是C语言标准所要求的,并不是某个编译器的扩展功能。

一个例子:

1
printf("Hello" " World""!"    "\n");

以上代码完全等同于:

1
printf("Hello World!\n");

参考资料:
How does concatenation of two string literals work?

printf格式化字符串漏洞攻击

前几天去Intel面试时,遇到了一个问题:printf("%s", s)printf(s)有何区别?面试官还提示我从安全的角度回答这个问题,然而当时并没有想出答案来……:( 回来后仔细研究了下这个问题,才发现pritnf(s)这种写法是存在严重安全漏洞的,这被称为printf格式化字符串漏洞攻击。