main() 在 C++ 中重载



2 C++中存在main()的有效版本:

int main()  // version 1
int main(int argc, char **argv)  // version 2

但是这两种重载不能同时共存。为什么不呢?(可能的用例:从终端运行程序时,如果没有传递参数,则调用第一个版本,否则调用第二个版本。

编译器是否执行特殊检查以允许每个二进制文件一个版本?

§3.6.1/2 (C++03( 说

实现不应预定义 main函数。此功能应 不要超载。它应具有 返回类型为 int 的类型,否则 其类型是实现定义的。 所有实现应允许两者 主的以下定义:

   int main() { /* ... */ }
   int main(int argc, char* argv[]) { /* ... */ }

您可以使用其中任何一个。两者都符合标准。

此外,由于char *argv[]等同于char **argv,因此用char **argv替换char *argv[]没有任何区别。


但是两个版本不能同时共存!(用例可以是:从命令提示符运行二进制文件时,如果您不传递任何参数,则应称为第一个版本,否则应称为第二个版本(。

不。两个版本不能同时共存。一个程序可以只有一个main功能。哪一个,取决于您的选择。如果要处理命令行参数,则必须选择第二个版本,否则第一个版本就足够了。另请注意,如果您使用第二个版本,并且不传递任何命令行参数,则不会造成任何伤害。它不会引起任何错误。你只需要解释argc并相应地argv,根据它们的值,你必须编写程序的逻辑和流程。

Windows

和Unix具有:

int main(int argc, char **argv, char **envp)

和 Win32 应用具有:

int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

MacOS 具有:

int main(int argc, char **argv, char **envp, char **apple)

不要忘记,main通常不是操作系统在执行程序时调用的第一件事。main函数是由运行时环境调用的函数。要执行的第一条指令的地址通常在一些元数据中声明,通常在可执行文件的开头声明。

据我所知,以上都没有与C/C++标准相矛盾,只要只有一个,这是有道理的,因为如果有多个,操作系统将不知道该调用哪个。检查只有一个不是在编译器中完成的,而是在链接器中完成的。

C++ Standard 1998 和 2003 版本的第 3.6.1.2 节指出:

实现不应预定义主函数。此函数不得重载。它应具有 int 类型的返回类型,否则其类型是实现定义的。

进一步

ISO

C++标准 (ISO/IEC 14882:1998( 明确要求 main 返回 int。它对格式良好的程序有明确的"应"约束。

§ 3.6.1 ¶ 2:

它应具有 int 的返回类型,但除此之外,其类型是实现定义的。所有实现都应允许以下两个 main 定义:

int main() { /* … */ }

int main(int argc, char* argv[]) { /* … */ }

因此,标准允许两个版本的main,使用哪个版本作为程序员的实现偏好。

Main 是在 C 时代定义的。它更多地按照 printf 的规则进行设置。将main视为一个瓦拉迪函数:

int main(...)

该标准说没有参数和两个指针参数是可以的。但是,如果实现想要提供更多参数,则实现可以自由地这样做。

不能有两个main的原因与不能在 C 程序中定义两次类似printf函数的原因相同。当然,printf支持不同的参数,并根据存在哪些参数来改变它的行为,但它并不是C++意义上的重载。

标准规定main不能超载。它不会损坏,并且不能有两个具有相同未修改名称的函数。我猜这会导致链接失败,但编译器可能希望添加显式检查以提供更清晰的错误消息。

int main(int argc, char **argv)int main() 应该是它的首选签名,但编译器可以自由接受具有不同参数的main

不可能

在 C++ 中重载 main((,因为。 编译器显示以下错误:

error C2731: 'main' : function cannot be overloaded 

相关内容

  • 没有找到相关文章

最新更新