gpt4 book ai didi

c - C 中的 int foo (int argc, ...) vs int foo() vs int foo(void)

转载 作者:太空狗 更新时间:2023-10-29 15:02:47 24 4
gpt4 key购买 nike

所以今天我想(承认这是第一次)int foo() 实际上不同于 int foo(void) 因为第一个允许 < em>任何 个输入,第二个允许

int foo() 是否简单地忽略任何给定的输入?如果是这样,允许这种形式的功能有什么意义?如果没有,您如何访问它们?这与具有可变参数列表(例如 int foo (int argc, ...))有何不同?

最佳答案

理解这一点的关键是理解调用堆栈。当您在 C 中调用函数(使用标准 x86 ABI——其他平台可能有所不同)时,调用者将所有参数以相反的顺序压入堆栈,然后再调用被调用者。然后,被调用者可以读取任意数量的参数。如果您使用 foo(void),显然您不会读取任何内容。如果您使用 foo(int),您将能够在当前帧下方的堆栈中读取一个单词。

使用 foo()(未指定参数)意味着编译器不会检查您传递给 foo 的参数。什么都可以;没有契约(Contract)。如果 foo 有两个采用不同类型作为参数的不同实现,并且我希望能够以编程方式切换它们,这将很有用。 (在汇编程序中编写函数时,它有时也很有用,您可以自己处理堆栈和参数。)但请记住,编译器不会为您进行任何类型检查,因此您必须非常小心。

这与 foo(int, ...) 不同,因为在那种情况下,该函数实际上有一种访问所有参数的方法(使用可变参数)。没有理由用 foo() 实际定义一个函数,因为它基本上等同于 foo(void)。 foo() 仅对声明有用。

关于c - C 中的 int foo (int argc, ...) vs int foo() vs int foo(void),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9784467/

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