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