示例代码:
#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搜索了很多但却找不到它。
任何建议的解决方法也很有用。
答案 0 :(得分:7)
Per 6.10.3.2 #erler (C11):
语义
2 - [...]对应于空参数的字符串文字是
""
。 [...]
所以我认为MSVC在这里是不正确的。
我会使用字符串文字串联来解决这个问题:
#define FOO(...) You passed: "" #__VA_ARGS__
答案 1 :(得分:3)
标准中的段落(ISO14882:2011(e))有点冗长,但很明显:
2 字符串文字是 string-literal ,没有 字首。如果在替换列表中,则立即生成参数 在#preprocessing token之前,两者都被一个替换 包含的字符串文字预处理标记 对应的预处理标记序列的拼写 论点。参数之间每次出现白色空格 预处理标记成为角色中的单个空格字符 字符串字面量。第一个预处理令牌之前的空格和 在包含参数的最后一个预处理标记被删除之后。 否则,每个预处理令牌的原始拼写 参数保留在字符串文字中,除了 生成字符串文字和拼写的特殊处理 字符文字:在每个“和”之前插入\字符 字符文字或字符串文字的字符(包括 分隔“字符”。如果替换结果不是 有效的字符串文字,行为未定义。的的 对应于空参数的字符串文字是“”。 #和##运算符的评估顺序未指定。
从那以后
2 替换列表中出现的标识符
__VA_ARGS__
应被视为参数和变量参数 应形成用于替换它的预处理令牌。
这与varags相同,与普通参数相同。