字符串化操作 #
http://msdn.microsoft.com/en-US/library/7e3a913x(v=vs.80).aspx
注意:
宏中遇到#或##时就不会再展开宏中嵌套的宏了
code:
1: #define STRING(x) #x2: printf("%s\n", STRING(__FILE__)); /*指向"__FILE__"而不是"E:\\XXX.cpp"形式*/结果:
code:
1: printf("%s\n", __FILE__);结果:
推荐使用
code:
1: #define _STRING(x) #x2: #define STRING(x) _STRING(x)3: printf("%s\n", STRING(__FILE__));结果:
字符化操作 #@
http://msdn.microsoft.com/en-US/library/91tt6dfs(v=vs.80).aspx
code:
1: #define makechar(x) #@x2: char ch = makechar(b);
结果:
符号拼接操作 ##
http://msdn.microsoft.com/en-US/library/09dwwt6y(v=vs.80).aspx
code:
1: #define paster( n ) printf( "token"#n" = %d\n", token##n )2: int token9 = 100;3: paster( 9 );
结果:
解析:
宏展开后token##n直接合并变成了token9。整个语句变成了
1: printf( "token""9"" = %d\n", token9 );
在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于
1: printf("token9 = %d\n", token9);
注意点:
不要使用##连接字符串,字符串是直接拼接的。
比如 生成 如xxx.cfg的字符串
#file_name##".cfg" vs能够正常拼接,但是当在linux下gcc编译时报错
应修改为 #file_name".cfg"