parmN 的声明应符合要求
6.5.3 ID_badParmN
可变参数列表中省略号的前一个参数称为 parmN,如果:
- 在 C 代码中,parmN 为数组、函数,或具有寄存器存储类,以及与默认参数提升后不兼容的类型
- 在 C++ 代码中,parmN 为引用、数组、函数,或具有与默认参数提升后不兼容的类型
会导致标准未定义的行为。
示例:
void foo(float f, ...); // Non-compliant
void bar(int& r, ...); // Non-compliant in C++
void baz(register int n, ...); // Non-compliant in C
例中参数 f 为 float 型,与“默认参数提升(default argument promotion)”后的类型 double 不兼容,参数 r 为引用,参数 n 被 register 关键字限定具有寄存器存储类,这种代码均会导致标准未定义的行为。
相关
依据
ISO/IEC 9899:1999 7.15.1.4(4)-undefined
ISO/IEC 9899:2011 7.16.1.4(4)-undefined
ISO/IEC 14882:2003 18.7(3)-undefined
ISO/IEC 14882:2011 18.10(3)-undefined