2013-06-28 34 views
1

在C语言中,当调用的函数没有原型时,编译器执行默认参数升级默认参数促销何时发生?

但是C++怎么样?默认参数促销何时会发生?

在C++ 11标准5.2.2/7:

当存在对于给定的参数没有参数,该参数是 以这样的方式使得接收功能能够获得值传递 通过调用va_arg(18.10)的论点。 [注意:此段 不适用于传递给函数参数包的参数。 函数参数包在模板实例化 (14.5.3)期间展开,因此实际调用功能模板专用化时,每个此类参数都有相应的参数。结束符 参数表达式执行了左值到右值(4.1),数组到指针(4.2)和 函数到指针(4.3)的标准转换。具有(可能是cv合格)类型 std :: nullptr_t的参数被转换为void *(4.10)类型。在这些 转换之后,如果参数没有算术,枚举,指针,成员指针或类类型,则该程序是格式不正确的。 传递具有非平凡复制构造函数,非平凡移动构造函数, 或非平凡析构函数,并且没有相应参数的类类型(第9章) 的潜在评估参数是 有条件地支持实现定义语义。如果参数 的整数或枚举类型受 积分促销(4.5)或浮点类型( )影响的浮点促销(4.6),则参数的值为 转换为促销在通话之前键入。这些促销活动是 ,被称为默认参数促销活动。

该段落仍未指定默认参数提升何时发生。没有明确的逻辑,这一段可能会说得太多。我努力概述逻辑但失败了。我不熟悉调用va_arg的

希望你能帮助我。

回答

1

在调用上下文之前调用函数之前会发生默认促销。

如果你确实在问在什么情况下进行默认促销活动,这在摘录中已有介绍,尽管它很小,很容易错过:“当给定参数没有参数时。 ..“。换句话说,它与C中的情况基本相同,不同之处在于C++中不存在C型函数声明,它没有指定参数类型。因此,只有当函数具有明确的省略号时,如果没有指定其类型的参数,唯一的一次参数是printfint printf(char const *format, ...);

1

从您在您的问题中引用的段落:“在调用之前将参数的值转换为促销类型”

你说的C“默认参数提升,当被调用的函数没有原型时” - 但记住C++中不存在场景 - 你不能调用没有看到声明或定义的函数。

提及“调用va_arg”意味着在调用函数时会应用某些参数促销,该函数将使用va_arg函数(请参阅http://linux.die.net/man/3/va_arg)访问这些值。可以这样想:一个函数调用可能会传递值int(3),另一个int(7777),又一个char(7) - 被调用的函数应该如何知道该期待什么?它可能会推动该参数的所有值给部分最大支持的综合型,如intlong,那么当va_arg是在函数中使用它会转换从intlong到任何整数类型va_arg调用指定。例如,这确实意味着int(7777)值可能只在预期的char处传递,并且该值可能会在没有警告的情况下被截断为8位,但这通常比程序崩溃更好,因为传递的数据字节数没有“不匹配所消耗的数量,或其他一些奇怪的副作用。