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

What is #__VA_ARGS__ supposed to generate when there are no arguments passed?

本文关键字:ARGS VA 什么 参数      更新时间:2023-10-16

示例代码:

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

使用Visual c++ (version 14 CTP)进行预处理,得到:

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

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

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

任何建议的变通方法也很有用。

/ 6.10.3.2 #操作符 (C11):

<

语义/h3>

2 -[…]空参数对应的字符串字面值为""。[…]

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

我将使用字符串字面值连接来解决这个问题:

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

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

16.3.2 # operator

2一个字符串字面值是一个字符串字面值没有前缀。如果,在替换列表中,参数为立即前面有一个#预处理标记,两个标记都被单个标记取代字符串字面值预处理记号,其中包含的预处理令牌序列的拼写论点。参数之间每次出现空格预处理令牌成为字符中的单个空格字符字符串文字。第一个预处理令牌和之前的空白在删除包含参数的最后一个预处理令牌之后。中的每个预处理标记的原始拼写参数保留在字符串字面值中,除了生成字符串字面值和的拼写的特殊处理字符字面量:在每个"answers"之前插入一个字符字符字面值或字符串字面值(包括分隔"字符")。如果替换的结果不是一个有效的字符串字面量,行为未定义。的与空参数对应的字符串字面值是"。操作符#和##的求值顺序未指定。

由于

16.3.1参数替换

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