====== #参数字符串化(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)); } {{tag>C语言}}