C++ 当没有传递参数时,#VA_ARGS_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu应该生成什么?

C++ 当没有传递参数时,#VA_ARGS_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu应该生成什么?,c++,c-preprocessor,variadic-macros,C++,C Preprocessor,Variadic Macros,示例代码: #define FOO(...) You passed: #__VA_ARGS__ FOO(1,2,3) FOO() 用Visual C++(14版CTP)进行预处理,得到: 在最后一行,#uu VA_uargs_uu变成了虚无。我更希望它变成“” 对于应该发生的事情,是否有明确的参考?我在谷歌上搜索了很多,但都找不到 任何建议的解决方法也会很有用。根据6.10.3.2操作人员(C11): 语义学 2-[…]与空参数相对应的字符串文字为“”。[……] 所以我认为MSVC在这里是不正

示例代码:

#define FOO(...) You passed: #__VA_ARGS__
FOO(1,2,3)
FOO()

用Visual C++(14版CTP)进行预处理,得到:

在最后一行,
#uu VA_uargs_uu
变成了虚无。我更希望它变成“”

对于应该发生的事情,是否有明确的参考?我在谷歌上搜索了很多,但都找不到

任何建议的解决方法也会很有用。

根据6.10.3.2操作人员(C11):

语义学 2-[…]与空参数相对应的字符串文字为
”。[……]

所以我认为MSVC在这里是不正确的

我将使用字符串文字连接解决此问题:

#define FOO(...) You passed: "" #__VA_ARGS__

标准(ISO14882:2011(e))中的段落有点长,但非常清楚:

16.3.2#操作员 2字符串文字是没有 前缀如果在替换列表中,参数立即 前面有一个#预处理标记,两者都被一个 包含 对应的预处理令牌序列的拼写 论点参数的 预处理标记将成为字符中的单个空格字符 字符串文字。第一个预处理标记前的空白,以及 在包含参数的最后一个预处理标记被删除之后。 否则,每个预处理标记在 参数保留在字符串文字中,但 用于生成字符串文本和字符串的拼写的特殊处理 字符文字:在每个“和”之前插入\字符\ 字符文字或字符串文字的字符(包括 划界字符)。如果更换的结果不是 有效的字符串文字,行为未定义最新版本 与空参数相对应的字符串文字为“.” 未指定#和##运算符的求值顺序

自从

16.3.1参数替换 2替换列表中出现的标识符 应将其视为参数,并且变量参数 应形成用于替换的预处理令牌


varags的情况与正常参数相同。

标准可能未规定。当我在
gcc
的预处理器下运行时,我当前得到了
。您是否查看了预处理的源代码,或者您是否有可能误解了测试程序的输出?这没有什么区别,是吗?您可以随时将结果连接到您喜欢的任何字符串中:
“Hello:”FOO()“!\n”
好吧,VC++从来没有假装完全实现C99或C11,所以很难说它是错误的;只是不一样。谢谢;我用一个简单的参数(
#define FOO(x)
)尝试了一下,结果它的行为是一样的。@Bryan:那对我来说好像是个bug。但是微软的人喜欢称这些东西为“功能”,所以除非你问他们(通过提交错误报告),否则我们永远不会知道。
#define FOO(...) You passed: "" #__VA_ARGS__