我发现MSVC和Clang的宏字符串化有所不同。是否可以在Clang中编写一个字符串化宏,使其与MSVC中的字符串化相同?
#define __IN_QUOTES(str) #str
#define IN_QUOTES(str) __IN_QUOTES(str)
#define HELLO_WORLD Hello world
int main()
{
#ifdef _MSVC_LANG
printf("%s", "MSVC\r\n");
#else
printf("%s", "CLANG\r\n");
#endif
printf("%s", IN_QUOTES(HELLO_WORLD));
return 0;
}
此代码在Clang和MSVC中均相同,但是如果我将第3行写为
#define HELLO_WORLD Hello, world
它可以在MSVC(带有“ Hello,world”)的输出中进行编译,但不能在Clang中进行编译,并出现错误“为函数式宏调用提供了太多参数”。 问题是否有可能编写在Clang和MSVC中都可能产生“ Hello,world”的IN_QUOTES宏? 我尝试过
#define IN_QUOTES((str)) __IN_QUOTES(str)
它在Clang和MSVC中返回“(Hello,world)”,但对我而言,没有括号就很有趣。
答案 0 :(得分:0)
以下是正确的,并且可以在任何符合要求的C99编译器上工作:
#define __IN_QUOTES(...) #__VA_ARGS__
#define IN_QUOTES(str) __IN_QUOTES(str)
它可以与我在Compiler Explorer上找到的MSVC版本(以及Clang和GCC)一起使用。
请注意,它不能准确保留空白,但是您对此无能为力。
(我不得不将#ifdef
更改为#ifdef _MSC_VER
;我尝试过的所有在线编译器似乎都没有定义_MSVC_LANG
。)