什么是#__VA_ARGS__应该在没有传递参数时生成?

时间:2014-07-01 08:58:47

标签: c++ c-preprocessor variadic-macros

示例代码:

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

使用Visual C ++(版本14 CTP)进行预处理,获取:

You passed: "1,2,3"
You passed:

在最后一行中,#__VA_ARGS__变成了虚无。我希望它变成“”。

对于应该发生的事情,是否有明确的参考?我用Google搜索了很多但却找不到它。

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

2 个答案:

答案 0 :(得分:7)

Per 6.10.3.2 #erler (C11):

  

语义

     

2 - [...]对应于空参数的字符串文字是""。 [...]

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

我会使用字符串文字串联来解决这个问题:

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

答案 1 :(得分:3)

标准中的段落(ISO14882:2011(e))有点冗长,但很明显:

16.3.2#运算符

  

2 字符串文字 string-literal ,没有   字首。如果在替换列表中,则立即生成参数   在#preprocessing token之前,两者都被一个替换   包含的字符串文字预处理标记   对应的预处理标记序列的拼写   论点。参数之间每次出现白色空格   预处理标记成为角色中的单个空格字符   字符串字面量。第一个预处理令牌之前的空格和   在包含参数的最后一个预处理标记被删除之后。   否则,每个预处理令牌的原始拼写   参数保留在字符串文字中,除了   生成字符串文字和拼写的特殊处理   字符文字:在每个“和”之前插入\字符   字符文字或字符串文字的字符(包括   分隔“字符”。如果替换结果不是   有效的字符串文字,行为未定义。的的   对应于空参数的字符串文字是“”。   #和##运算符的评估顺序未指定。

从那以后

16.3.1参数替换

  

2 替换列表中出现的标识符__VA_ARGS__   应被视为参数和变量参数   应形成用于替换它的预处理令牌。

这与varags相同,与普通参数相同。