跳至内容
响水凹
欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki
用户工具
登录
站点工具
搜索
工具
显示页面
过去修订
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
您的足迹:
computer:c:tips:macro_stringization
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== #参数字符串化(Macro stringization) ====== 标准C使用#符号将宏参数字符串化(stringization)。#后面必须是一个宏参数名,当宏扩展时,#和后面的宏参数名替换成实际参数内容构成的字符串常量。 转化时,实参中的引号和转义前会添加\以保留它的原义。 例如: <code> #define TEST(a, b) printf( #a " < " #b " = %d\n", (a) < (b) ) </code> 调用TEST(0, 0xFFFF)和TEST('\n', 10)分别扩展为: <code c> printf( "0" " < " "0xFFFF" " = %d\n", (0) < (0xFFFF) ); printf( "'\\n'" " < " "10" " = %d\n", ('\n') < (10) ); </code> 执行结果: <code> 0 < 0xFFFF = 1 '\n' < 10 = 0 </code> 有些非标准的编译器的处理方式与标准C有很大不同,有的会替换字符常量和字符串常量里的宏参数,有的不会添加\转义,等等。所以,只在标准C中使用这个特性。 再看一个例子: <code> #define str(x) #x #define DATA_TYPE char int main(void) { printf("sizeof(%s)=%ld\n", str(DATA_TYPE), sizeof(DATA_TYPE)); } </code> 本意是想输出sizeof(char)=1,结果却是sizeof(DATA_TYPE)=1。这是因为按定义#会立即字符串化宏参数,而不会进一步扩展。解决方法是使用两步的“迂回战术”,迫使宏既字符串化又扩展: <code> #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)); } </code> {{tag>C语言}}
computer/c/tips/macro_stringization.txt
· 最后更改: 2014/11/01 02:02 由
127.0.0.1
页面工具
显示页面
过去修订
反向链接
回到顶部