美文网首页
宏中的#和##

宏中的#和##

作者: 丹丹十个胆小鬼 | 来源:发表于2019-03-19 16:49 被阅读0次

本文截取自: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编译后的代码,程序正常运行。


20171209173118273.png

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


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

##的作用

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

相关文章

网友评论

      本文标题:宏中的#和##

      本文链接:https://www.haomeiwen.com/subject/ixrnmqtx.html