c语言 宏的一些深层应用(##,#,宏函数)
"##" 宏拼接
#define CONCATENATE(a, b) a ## b
CONCATENATE(student_, 1) // 将a和b拼接起来变成一个新的变量 -> student_1
#define CONS(a,b) int(a##e##b)
CONS(2,3) //将aeb拼接起来 -> 2e3 == 2000
"#" 转换为字符串
#define CONCATENATE(a, b) a ## b
#define STR(s) #s
STR(CONCATENATE(student_, 1))// 将a和b拼接起来变成一个新的变量 -> student_1 再转换为字符串 -> "student_1"
哈哈,你觉得上面注释说的是对的吗?nonono,我在编译器尝试用printf("%s", STR(CONCATENATE(student_, 1)));
输出了一下,输出是CONCATENATE(student_, 1)
。这个优先级问题本文就先不讨论啦,有兴趣的朋友可以自己去看看优先级的问题。
那如果我就是要输出student_1
怎么办呢?起始很简单看我下面操作!
#define CONCATENATE(a, b) a ## b
#define _STR(s) #s
#define STR(s) _STR(s)
这时候编译器的输出就是我们期望的student_1
了。至于原理,咱也不敢问,但是知道有这个用法就行了。
宏函数
// #define 宏名称( [形参列表] ) 替换文本
#define DOUBLE(x) (x+x)
#define MAX(a,b) ((a)>(b)?(a):(b))
更多内容请参考以下文章:
https://blog.csdn.net/m0_62918577/article/details/127361768
https://www.cnblogs.com/hnrainll/archive/2012/08/15/2640558.html
https://blog.csdn.net/weixin_46187354/article/details/133611969