computer:c:tips:macro_stringization
这是本文档旧的修订版!
#参数字符串化(Macro stringization)
标准C使用#符号将宏参数字符串化(stringization)。#后面必须是一个宏参数名,当宏扩展时,#和后面的宏参数名替换成实际参数内容构成的字符串常量。
转化时,实参中的引号和转义前会添加\以保留它的原义。
例如:
#define TEST(a, b) printf( #a " < " #b " = %d\n", (a) < (b) )
调用TEST(0, 0xFFFF)和TEST('\n', 10)分别扩展为:
printf( "0" " < " "0xFFFF" " = %d\n", (0) < (0xFFFF) ); printf( "'\\n'" " < " "10" " = %d\n", ('\n') < (10) );
执行结果:
0 < 0xFFFF = 1 '\n' < 10 = 0
有些非标准的编译器的处理方式与标准C有很大不同,有的会替换字符常量和字符串常量里的宏参数,有的不会添加\转义,等等。所以,只在标准C中使用这个特性。
再看一个例子:
#define str(x) #x #define DATA_TYPE char int main(void) { printf("sizeof(%s)=%ld\n", str(DATA_TYPE), sizeof(DATA_TYPE)); }
本意是想输出sizeof(char)=1,结果却是sizeof(DATA_TYPE)=1。这是因为按定义#会立即字符串化宏参数,而不会进一步扩展。解决方法是使用两步的“迂回战术”,迫使宏既字符串化又扩展:
#define str(x) #x #define xstr(x) str(x) #define DATA_TYPE char int main(void) { printf("sizeof(%s)=%ld\n", xstr(DATA_TYPE), sizeof(DATA_TYPE)); }
computer/c/tips/macro_stringization.1409912468.txt.gz · 最后更改: 2014/11/01 02:02 (外部编辑)