【问题标题】:What does this declare `void func(bool b ...)`?这声明了什么'void func(bool b ...)'?
【发布时间】:2013-03-17 14:50:31
【问题描述】:

我回答了这个问题How can I get my va_list arguments to repeat itself? 并注意到了不常见的函数声明:

void ordered(int num1, double list ...);

首先我认为编译器会抱怨,但 clang 3.2 没有,g++ 4.7.2 也没有。

此声明扩展为什么?它被解释为什么?

编辑:我知道省略号。但正常形式是<return type> <function-name>(<argument1-type> <arg-name>, ...);,示例中缺少逗号。

【问题讨论】:

标签: c++ function


【解决方案1】:

同理:

void ordered(int num1, double list, ...);

【讨论】:

  • 我猜该声明不适用于va_arg?我的测试至少表明它们没有。
  • @RedX,它应该与任何其他 C 可变参数函数一样工作。
【解决方案2】:

这是 C++ 标准中语法的 sn-p:

parameter-declaration-clause:
  parameter-declaration-list[opt] ...[opt]
  parameter-declaration-list , ...

如果是其他参数声明,基本上可以在省略号前面加上,,但不必如此。函数声明:

void f(int,double...);

真正的意思:

void f(int,double,...);

【讨论】:

  • 有趣,不知道这种情况下的逗号是可选的。谢谢。
【解决方案3】:
void ordered(int num1, double list ...);

等同于:

void ordered(int num1, double list, ...);

参考:
标准 C++11 8.3.5.3/4:

parameter-declaration-clause:
parameter-declaration-listopt ...opt
parameter-declaration-list , ...

如果parameter-declaration-clause 以省略号或函数参数包 (14.5.3) 结尾,则参数的数量应等于或大于没有默认参数且不是函数参数的参数的数量包。如果语法正确且“...” 不是abstract-declarator 的一部分,“, ...”“...” 的同义词。

【讨论】:

    【解决方案4】:

    三个点 (...) 称为“椭圆”,表示变量参数列表。因此,您可以传递任意数量的参数(尽管存在操作系统指定的限制)。以这种方式,例如,printf 起作用。

    更多解释请见here

    【讨论】:

      【解决方案5】:

      我猜你的意思是“...”对吧?

      对于某些函数,无法指定调用中预期的所有参数的数量和类型。通过使用省略号 (...) 终止参数声明列表来声明此类函数。

      【讨论】:

        猜你喜欢
        • 2012-02-15
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        相关资源
        最近更新 更多