【问题标题】:Different macro stringification rules in Clang and MSVCClang 和 MSVC 中不同的宏字符串化规则
【发布时间】: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


【解决方案1】:

以下是正确的,并且应该适用于任何符合 C99 的编译器:

#define __IN_QUOTES(...) #__VA_ARGS__
#define IN_QUOTES(str) __IN_QUOTES(str)

它适用于我在 Compiler Explorer 上找到的 MSVC 版本(以及 Clang 和 GCC)。

请注意,它不会准确地保留空白,但您对此无能为力。

(我不得不将#ifdef 更改为#ifdef _MSC_VER;我尝试的所有在线编译器似乎都没有定义_MSVC_LANG。)

【讨论】:

    猜你喜欢
    • 2013-10-18
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2011-02-08
    相关资源
    最近更新 更多