gpt4 book ai didi

c - 为什么C main函数的编码可以带参数也可以不带参数?

转载 作者:太空狗 更新时间:2023-10-29 17:09:53 25 4
gpt4 key购买 nike

只是想知道这是为什么

int main(void){}

编译和链接

还有这个:

int main(int argc, char **argv){}

为什么不必须是其中之一?

gcc 甚至会用一个参数进行编译和链接:

int main(int argc){}

但使用 -Wall 发出此警告:

smallest_1.5.c:3:1: warning: ‘main’ takes only zero or two arguments [-Wmain]

我不是在问“他们为什么允许这样做?”但是就像“调用者和链接器如何处理 main 的多种可能性?”

最佳答案

下面我从 Linux 的角度来看。

main 函数在标准定义中非常特殊(对于托管的 C11 实现)。最近的编译器(GCCClang/LLVM ....)也明确知道它有处理 main 的特定代码(并给你这个警告)。顺便说一句,GCC(在 GNU libc 标题到 function attributes 的帮助下)也有用于 printf 的特殊代码。您可以使用 MELT 向 GCC 添加您自己的定制。为您自己的功能属性。

对于linker , main 通常是一个常用的符号,但它是从 crt0 调用的(使用 gcc -v 编译您的代码以了解其真正含义)。顺便说一句,ld(1)链接器(和 ELF 文件,例如 executablesobject files )没有类型或函数签名的概念,只处理名称(这就是 C++ 编译器做一些 name mangling 的原因)。

还有 ABIcalling conventions如此定义,将未使用的参数传递给函数(如 main 甚至 open(2) ...)不会造成任何伤害(几个参数在寄存器中传递)。阅读 x86-64 System V ABI了解详情。

另请参阅 this answer 中的引用资料.

最后,您真的应该将 main 实际上定义为 int main(int argc, char**argv) 而不是其他任何东西,您希望应该 handle通过它们编程参数(至少 --help--versionGNU coding standards 规定)。在 Linux 上,我讨厌程序(我诅咒他们的程序员)不这样做(所以处理--help & --版本).

关于c - 为什么C main函数的编码可以带参数也可以不带参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550081/

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