相关疑难解决方法(0)

最后命名参数不是函数还是数组?

这个问题是关于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++的问题).

c c++ arrays variadic-functions

16
推荐指数
2
解决办法
1077
查看次数

标签 统计

arrays ×1

c ×1

c++ ×1

variadic-functions ×1