Clang和MSVC中不同的宏字符串化规则

时间:2019-01-11 19:02:50

标签: visual-c++ clang c-preprocessor

我发现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)”,但对我而言,没有括号就很有趣。

1 个答案:

答案 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。)