[奇怪の东西]关于宏的那些事儿
看到一些关于宏的有意思的东西,记录一下。
关于宏定义中的 #,##,#@
一共就仨东西......
#
将对应的变量字符串化,例如#define trace(x, format) printf(#x " = %" #format "\n", x)
,使用trace(i, d)
就相当于printf("x = %d\n", x)
;##
将把宏参数名与宏定义代码序列中的标识符连接在一起,形成一个新的标识符,例如#define trace2(i) trace(x##i, d)
,使用trace2(2)
就相当于trace(x2, d)
;#@
将单字符标记符变换为单字符,即加单引号,例如#define B(x) #@x
,使用B(a)
就是'a'
,但是B(abc)
就......;
自带的宏
自带的宏有很多,例如 __FILE__,__LINE__
等。
__FILE__
宏在预编译时会替换成当前的源文件名;__VA_ARGS__
一个可变参数的宏,总体来说就是将左边宏中...
的内容原样抄写在右边__VA_ARGS__
所在的位置,比如#define console(...) fprintf(stderr, __VA_ARGS__)
,调用console("x == %d\n", x)
就会解析为fprintf(stderr, "x == %d\n", x)
;__LINE__
宏在预编译时会替换成当前的行号;__FUNCTION__
宏在预编译时会替换成当前的函数名称;__DATE__
宏在预编译时会替换成当前的编译日期;__TIME__
宏在预编译时会替换成当前编译时间;- 还有一些东西,不过都不甚重要了......;
真的没有了
超小容量,仅仅只是一个记录......