gpt4 book ai didi

c - 参数传递给函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:10 24 4
gpt4 key购买 nike

考虑以下来源:主程序

int main(){
print_hello("str");
return 0;
}

和你好.c

#include<stdio.h>
void print_hello(){
printf("Hello world\n");
}

在编译和链接 gcc -o hello hello.c main.c 后它工作正常,但我预计会发生错误。因为 main.c 中的 print_hellohello.c 中的 print_hello 的签名是不同的。为什么它工作正常?

最佳答案

您的编译器使用 calling convention这允许额外的参数传递给被调用的函数而没有额外的效果。这是典型的 C 调用约定,因为它支持可变参数列表(如 printf、scanf 等)。在这样的约定中,

  • 参数按照第一个参数最接近栈顶(如果所有都放在栈上)或等效寄存器的顺序传递,其他按顺序放入,
  • 调用者知道使用的堆栈大小并在函数调用后恢复堆栈指针。

X86 calling conventions这通常命名为“cdecl”(可选,带有 1 或 2 个下划线)。

这样的约定可以容忍额外的参数,但绝对不能容忍随后被调用函数使用的未指定参数;后一种情况会导致参数中出现垃圾。

通常不应利用此类运行时功能,但在某些极端情况下它很有用。

为防止函数使用与其定义不匹配,您应该对两者使用相同的声明。通常,它会将相同的头文件包含到声明或调用此函数的所有源中。

关于c - 参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20866403/

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