gpt4 book ai didi

c - visual c++ 与 gcc/clang 中的不同行为,同时对包含逗号的参数进行字符串化

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:13 27 4
gpt4 key购买 nike

我正在使用字符串化运算符将可能包含传递给宏的逗号的参数转换为字符串。据我所知,有些字符不能被字符串化——特别是逗号 (,),因为它用于分隔参数,右括号 ()) 因为它标记参数的结尾。所以我使用可变参数宏将逗号传递给字符串化运算符,如下所示:

#include <stdio.h>

#define TEST 10, 20

#define MAKE_STRING(...) #__VA_ARGS__
#define STRING(x) MAKE_STRING(x)

int main()
{
printf("%s\n", STRING(TEST) );
return 0;
}

它工作正常。但是我想到没有可变参数宏会发生什么,所以我修改了宏:#define MAKE_STRING(x) #x。它在 visual c++ 2008/2010 中意外编译良好,并输出 10, 20 而 gcc/clang 按预期给出编译错误:

macro "MAKE_STRING" passed 2 arguments, but takes just 1

所以我的问题是:Visual C++ 是在做额外的工作还是行为未定义?

最佳答案

VS 通常允许宏中的额外参数,然后静静地删除它们:STRING(10, 20, 30) - 仍然有效并打印 10。这里不是这种情况,但这几乎意味着 VS 甚至没有 gcc 抛给你的错误。

这不是任何额外的工作,而是“仅仅”替换顺序的不同。

关于c - visual c++ 与 gcc/clang 中的不同行为,同时对包含逗号的参数进行字符串化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22607515/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com