gpt4 book ai didi

c++ - 最后命名的参数不是函数或数组?

转载 作者:IT老高 更新时间:2023-10-28 22:21:25 30 4
gpt4 key购买 nike

这个问题是关于可变参数函数,以及它们的最后一个命名参数,在省略号之前:

void f(Type paramN, ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}

我正在阅读 C 标准,发现 va_start 宏有以下限制:

The parameter parmN is the identifier of the rightmost parameter in the variable parameter list in the function definition (the one just before the , ...). If the parameter parmN is declared with the register storage class, with a function or array type, or with a type that is not compatible with the type that results after application of the default argument promotions, the behavior is undefined.

我想知道为什么以下代码的行为未定义

void f(int paramN[], ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}

并没有为以下未定义

void f(int *paramN, ...) {
va_list ap;
va_start(ap, paramN);
va_end(ap);
}

这些宏旨在由纯 C 代码实现。但是纯 C 代码无法确定 paramN 是被声明为数组还是指针。在这两种情况下,参数的类型都被调整为指针。函数类型参数也是如此。

我想知道:这个限制的基本原理是什么?当这些参数调整在内部就位时,某些编译器是否在实现这一点时遇到问题? (同样的未定义行为也适用于 C++ - 所以我的问题也是关于 C++)。

最佳答案

对寄存器参数或函数参数的限制大概是这样的:

  • 您不能使用 register 获取变量的地址存储类。
  • 函数指针有时与指向对象的指针完全不同。例如,它们可能比指向对象的指针大(您不能可靠地将函数指针转换为对象指针并再次转换回来),因此将一些固定数字添加到函数指针的地址可能无法让您到达下一个参数.如果 va_start()和/或 va_arg()通过在 paramN 的地址上添加一些固定数量来实现并且函数指针大于对象指针,计算最终会得到对象的错误地址 va_arg()返回。这似乎不是实现这些宏的好方法,但可能有一些平台具有(甚至需要)这种类型的实现。

我想不出阻止允许数组参数的问题是什么,但 PJ Plauger 在他的《标准 C 库》一书中这样说:

Some of the restrictions imposed on the macros defined in <stdarg.h> seem unnecessarily severe. For some implementations, they are. Each was introduced, however, to meet the needs of at least one serious C implementation.

而且我想很少有人比 Plauger 更了解 C 库的来龙去脉。我希望有人可以用一个实际的例子来回答这个特定的问题;我认为这将是一个有趣的琐事。

新信息:


“国际标准的基本原理 - 编程语言 - C”是这么说的 va_start() :

The parmN argument to va_start was intended to be an aid to implementors writing the definition of a conforming va_start macro entirely in C, even using pre-C89 compilers (for example, by taking the address of the parameter). The restrictions on the declaration of the parmN parameter follow from the intent to allow this kind of implementation, as applying the & operator to a parameter name might not produce the intended result if the parameter’s declaration did not meet these restrictions.

这对我限制数组参数没有帮助。

关于c++ - 最后命名的参数不是函数或数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1353407/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com