【问题标题】:C++ variadic function syntaxC++ 可变参数函数语法
【发布时间】:2019-07-31 17:38:35
【问题描述】:

在 C++03 标准中,[dcl.fct] p.2 指出:

parameter-declaration-clause 确定在调用函数时可以指定的参数及其处理。 [注:parameter-declaration-clause用于转换函数调用上指定的参数;见 5.2.2。 —尾注]如果参数声明子句为空,则函数不接受参数。参数列表(void)等效于空参数列表。除了这种特殊情况,void 不应是参数类型(尽管派生自 void 的类型,例如 void*,可以)。如果参数声明子句以省略号结尾,则参数的数量应等于或大于没有默认参数的参数的数量。 在语法正确的情况下,“, ...”与“...”同义

parameter-declaration-clause 的语法允许它以..., ... 结尾。我找到了this question,答案说最初语法只允许...,并引入了逗号变体(, ...)以与C兼容。

我的问题是为什么引用的段落说“语法正确”?考虑到 function parameter packspack expansions 在 C++03 中不存在,是否存在将 ... 视为 , ... 同义词的“语法错误”?

谢谢。

【问题讨论】:

    标签: c++ language-lawyer variadic-functions


    【解决方案1】:

    就我的理解而言,这只是意味着当您以正确的语法使用,... 时,可以将其替换为... 例如:

    • int printf(const char*, ...); 是正确的语法,可以替换为int printf(const char*...);

    • int printf(,...); 语法不正确,不等同于int printf(...);

    您只需添加以下原型即可轻松尝试 C 代码:

    • void printf(...); --> 有效
    • void printf(,...); --> ',' 标记之前的预期主表达式

    【讨论】:

    • 感谢您的回答。我认为你的例子就是措辞试图涵盖的情况。
    • 只是一个简短的评论,在你回答的第一句话中,..., ... 不应该互换吗?
    【解决方案2】:

    在任何情况下,将 ... 视为 , ... 的同义词是“语法不正确”的吗?

    正如纪尧姆所说,重写将是“语法错误”

    foo(...)
    

    作为

    foo(, ...)
    

    所以该子句只处理没有先验参数的极端情况,省略号可以用逗号分隔。

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多