响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


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.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1