gpt4 book ai didi

c - 在 C 语言中,调用者是否曾经特别对待可变参数?

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:10 26 4
gpt4 key购买 nike

据我了解,C 可变参数完全在被调用方处理,也就是说,如果您用 f 调用函数

f(1, 2, 3.0)

无论您是否将 f 声明为

,编译器都会为调用生成相同的代码
void f(int, int, double);

void f(int, int, ...);

这个问题的上下文是this issue使用可变 FFI 定义从 Rust 调用一个非真正可变的 C 函数。如果从调用者的角度来看可变参数无关紧要(当然除了类型检查),那么我觉得 Rust 会为函数被声明为可变参数的调用生成不同的代码似乎很奇怪。

如果这实际上不是由 C 规范决定,而是依赖于 ABI,那么我最感兴趣的是 System V ABI 的答案。 ,从我读到的内容来看,这似乎并未表明调用方对可变参数有任何特殊处理。

最佳答案

这是一个非 ABI 特定的答案。

是的,调用者可以(并且在一般情况下,将)以特殊方式处理带有可变参数的函数。这实际上就是为什么从标准化时代开始,C 语言就要求所有可变参数函数在调用之前用原型(prototype)声明。请注意,即使在 C89/90 中可以安全地调用未声明的函数,这样做的权限并没有扩展到可变参数函数:那些总是必须提前声明。否则,行为未定义。

规则在现代 C 中仍然存在,但形式略有不同。即使 C99 之后的 C 不再允许调用未声明的函数,它仍然不需要原型(prototype)声明。然而,可变参数函数必须在调用之前用原型(prototype)声明。基本原理是一样的:调用者必须知道它正在调用可变参数函数,并且可能以不同方式处理调用。

从历史上看,有些实现在调用可变参数函数时使用完全不同的调用约定。

关于c - 在 C 语言中,调用者是否曾经特别对待可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987610/

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