我在http://www.gnu.org/s/libc/manual/html_node/Argument-Macros.html#Argument-Macros上阅读了在C中使用可变参数函数的方法.
但是,我无法理解自我推广数据类型的含义.它们是什么以及它们与非自我推广数据类型有何不同?
这是C99 标准;“自我提升”类型是在应用默认参数提升(第 6.5.2.2 节第 6 段,引用第 6.3.1.1 节中描述的整数提升)时提升自身的类型。
我的阅读va_arg定义(§7.15.1.1)是这种限制是由标准的暗示。相关部分在第2段:
[...] 或者如果类型与实际下一个参数的类型不兼容(根据默认参数提升)[...]
这对于被提升的实际下一个参数的类型非常清楚,但我读到没有说任何关于被提升的类型。(我认为“(as Promotion...)”子句只是提醒,当调用 varargs 函数时,会在尾随参数上执行默认参数升级。)
§J.2 中未定义行为列表中的此项支持以下阅读:
—
va_arg当没有实际的下一个参数,或者指定的类型与实际的下一个参数的提升类型不兼容时调用宏,某些例外 (7.15.1.1)。
(虽然是的,我知道,附件 J 是“信息性的”而不是“规范性的”......)。
在这种情况下:(va_arg(ap, float)例如)不能是有效的 -在这种情况下类型是float,但实际下一个参数的提升类型不可能是float(float参数将被提升为double)。