首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clang和MSVC中不同的宏字符串规则

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

Stack Overflow用户
提问于 2019-01-12 03:02:50
回答 1查看 180关注 0票数 1

我发现在MSVC和Clang中的宏字符号化是有区别的。是否有可能在Clang中编写一个与MSVC中的stringification相同的字符串宏?

代码语言:javascript
复制
#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行编写为

代码语言:javascript
复制
#define HELLO_WORLD Hello, world

它将可以在MSVC中编译(在输出中带有"Hello,world"),但不能在Clang中编译,并出现错误"too macro provided to function-like宏invocation“(提供给类似函数的宏调用的参数太多)。问题是,有没有可能编写一个IN_QUOTES宏来同时在Clang和MSVC中生成"Hello,world“?我试过了

代码语言:javascript
复制
#define IN_QUOTES((str)) __IN_QUOTES(str)

它在Clang和MSVC中返回"(Hello,world)“,但对我来说,获得它而不带括号是很有趣的。

EN

回答 1

Stack Overflow用户

发布于 2019-01-12 10:53:04

以下代码是正确的,应该可以在任何符合C99规范的编译器上运行:

代码语言:javascript
复制
#define __IN_QUOTES(...) #__VA_ARGS__
#define IN_QUOTES(str) __IN_QUOTES(str)

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54152545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档