将记号转化为字符串:
标准C语言中有一种机制可以将宏参数转换为字符串常量。宏定义中出现#记号被当作一元“字符串化”运算符,后面为宏正式参数名,宏扩展期间,#和正式参数名换成相应的包含在字符串引号当中的实际参数。生成字符串时,记号参数表中的每个空白序列转换为一个空格,使用反斜杠的字符保留其原意。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEST(a, b) printf(#a "<" #b "=%d\n", (a) < (b))
int main(int argc, char *argv[])
{
TEST(123, 789);
return 0;
}
输出为:
tim@tim-pc1:~/develop/temp$ ./a.out
123<789=1
宏扩展中的记号合并:
标准C语言合并记号形成新记号时,由宏定义中的合并运算符##控制,重新扫描更多宏之前,宏替换将##连接的两个记号合并。因此:##不能放在开头或者结尾,否则结果未定义。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEST2(a) temp ## a
int TEST2(3) = 10; //创建一个名称为temp3的变量
int main(int argc, char *argv[])
{
TEST(123, 789);
printf("#TEST2(3) is %d\n", TEST2(3));
return 0;
}
输出为:
tim@tim-pc1:~/develop/temp$ ./a.out
#TEST2(3) is 10
查看汇编,可以考到上述代码生成一个名称为temp3的变量
.globl temp3
.data
.align 4
.type temp3, @object
.size temp3, 4
temp3:
.long 10
.section .rodata