我是 C++ 的新手,我见过许多 C++ 编译器自动将 int argc,char* argv 作为参数传递到 main 函数中,但是它们在哪里定义的?有点好奇想知道。
这些通常由外壳程序提供,或者更具体地说,由父进程提供。也就是说,父进程可以决定要传递哪些参数(如果有)。这些显示在argc/ 中argv。有关exec从父进程的角度来看这看起来如何的示例,请参阅函数系列。还有用于启动进程的相同内核版本。
它们是由操作系统及其进程间机制专门定义并最终提供的。这是定义main()函数的C++ 标准的一部分。
这种机制继承自相同的 C 版本,这在很大程度上是 UNIX 本身设计的副产品,因为 C 和 UNIX 是串联产生的。
请阅读一本好的C++ 编程书籍,然后查看此 C++ 参考和一些 C++ 标准,如n3337或更好。
您的编译器(例如GCC)不会将argc和argv参数添加到main. 有了gcc -Wall -Wextra -g它正在检查main有以下参数(但你可以定义int main(void)或int main(int argc, char**argv, char**environ)Linux上)。重要的是 的签名main,而不是参数的确切名称(只是它们的类型和编号)。
您的操作系统(例如 Linux 及其内核)将这些传递给您的main. 在 Linux 上,程序由execve(2)启动,该系统调用将参数传递给main. 从技术上讲,调用堆栈的初始布局在 ABI 中指定。一些crt0初始化代码正在调用main(和静态构造函数)。该初始化代码是用汇编程序编写的。阅读一本好的操作系统教科书。
有时,C++ 以独立模式使用。然后,没有main并且其他约定适用。一个典型的例子是当你用 C++ 编写一个操作系统内核时(例子见OSDEV)
由于GCC、Linux内核和GNU libc是免费软件,因此您可以下载它们的源代码并进行研究(然后对其进行改进)。另请参阅LinuxFromScratch。
研究 - 寻找灵感 - 现有 C++ 开源项目的源代码,如Qt、FLTK、RefPerSys等。对于RefPerSys,请通过电子邮件与我联系basile@starynkevitch.net