这个问题是关于vararg函数,以及省略号之前的最后一个命名参数:
void f(Type paramN, ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
我正在阅读C标准,并发现va_start宏的以下限制:
参数parmN是函数定义中变量参数列表中最右边参数的标识符(恰好在......之前).如果参数parmN使用寄存器存储类,函数或数组类型声明,或者使用与应用默认参数提升后生成的类型不兼容的类型,则行为未定义.
我想知道为什么以下代码的行为未定义
void f(int paramN[], ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
并且未定义以下内容
void f(int *paramN, ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)
宏可以通过纯C代码实现.但纯C代码无法确定是否paramN声明为数组或指针.在这两种情况下,参数的类型都被调整为指针.功能类型参数也是如此.
我想知道:这个限制的理由是什么?在内部进行这些参数调整时,某些编译器是否存在实现此问题的问题?(C++也说明了相同的未定义行为 - 所以我的问题是关于C++的问题).