【发布时间】:2019-01-11 19:02:49
【问题描述】:
我发现 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 中编译,并出现错误“提供给类似函数的宏调用的参数过多”。 问题是可以编写 IN_QUOTES 宏来在 Clang 和 MSVC 中生成“Hello, world”吗? 我试过了
#define IN_QUOTES((str)) __IN_QUOTES(str)
它在 Clang 和 MSVC 中返回“(Hello, world)”,但对我来说,在没有括号的情况下获取它很有趣。
【问题讨论】:
-
会
__VA_ARGS__帮忙吗? -
嗯,带有
#define HELLO_WORLD Hello, world的程序格式不正确。 Clang 拒绝它是正确的,MSVC 接受它是错误的。让两者都编译它的第一步是修复代码,使其成为一个有效的程序。
标签: visual-c++ clang c-preprocessor