宏中的#和##

本文截取自:https://blog.csdn.net/boring_wednesday/article/details/78756696

#的用法

首先要理解一个原则,即邻近字符串连接原则

在C语言中
printf(“hello”” world!”“\n”);
这句话是合法的
打印结果为:
hello world!

按照上述原则,我们可以写出下列代码:

#define PRINT(FORMAT, VALUE) printf("the value of " #VALUE " is "FORMAT"\n", VALUE)

int main()
{
    int i = 0;
    PRINT("%d", i + 3);
    return 0;
}

看下gcc编译后的代码,程序正常运行。


宏中的#和##_第1张图片
20171209173118273.png

再通过gcc生成test.i文件看下预处理是怎么样的:


宏中的#和##_第2张图片
20171209173520670.png

所以我们可以看出来#的作用:
将一个宏参数变成一个对应的字符串
在上述例子中:

#VALUE被替换成了“i + 3”

别忘了被替换的时候i + 3两边加上了双引号

##的用法

看下面的代码片段

#define ADD_TO_AN(num, value) a##num += value

int main()
{
    int a1 = 0;
    int a2 = 0;
    ADD_TO_AN(1, 5);
    ADD_TO_AN(2, 6);
    return 0;
}

解释一下上面这段代码
假设有一个变量叫a1
此时代码片段为ADD_TO_AN(1, 5)
即替换为a1 += 5,给a1变量增加5
同理ADD_TO_AN(2, 6)则替换成a2 += 6

##的作用

将##两边的字符连在一起作为一个标识符
前提连接后的标识符必须合法,否则编译出现标识符未定义

你可能感兴趣的:(宏中的#和##)