我发现在MSVC和Clang中的宏字符号化是有区别的。是否有可能在Clang中编写一个与MSVC中的stringification相同的字符串宏?
#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中编译,并出现错误"too macro provided to function-like宏invocation“(提供给类似函数的宏调用的参数太多)。问题是,有没有可能编写一个IN_QUOTES宏来同时在Clang和MSVC中生成"Hello,world“?我试过了
#define IN_QUOTES((str)) __IN_QUOTES(str)它在Clang和MSVC中返回"(Hello,world)“,但对我来说,获得它而不带括号是很有趣的。
发布于 2019-01-12 10:53:04
以下代码是正确的,应该可以在任何符合C99规范的编译器上运行:
#define __IN_QUOTES(...) #__VA_ARGS__
#define IN_QUOTES(str) __IN_QUOTES(str)它适用于我在Compiler Explorer上找到的MSVC版本(以及Clang和GCC)。
请注意,它不会准确地保留空格,但您对此无能为力。
(我不得不将#ifdef更改为#ifdef _MSC_VER;我尝试的在线编译器似乎都没有定义_MSVC_LANG。)
https://stackoverflow.com/questions/54152545
复制相似问题