C/C++中的两个“主要”函数

32

我可以用C或C ++编写具有两个主函数的程序吗?


7
好的,我会尽力进行翻译。以下是您要求的内容的翻译:你希望他们做什么?应该叫哪一个? - Peter Lang
26
改编孔子的话,千里之行始于足下。一个程序不能有两个main()函数。 - John Feminella
3
不知道是否相关,但一些程序(如busybox)有一个main()实现,检查argv[0]的值,然后根据argv[0]的值调用相应的something_else_main()函数。这样,您可以拥有一个单一的可执行文件,根据其文件名以完全不同的方式运行。与符号链接一起使用,这可以节省磁盘空间,因为不需要在多个可执行文件中复制共享代码。(共享库也可以做到这一点,但维护起来更麻烦) - Jeremy Friesner
@JeremyFriesner,int main(int argc, char **argv){ int (*start)(int, char **); if (strcmp(argv[0], "file_name1") == 0) start = start_file_name1; else if (strcmp(argv[0], "file_name2") == 0) start = start_file_name2; /* etc */ else start = start_other; return start(argc, argv); }这个程序为什么需要两个“main”?另外,如果有两个主函数,可执行文件如何根据文件名选择调用哪一个呢? - Shahbaz
@Shahbaz,我没有看到代码有什么问题,虽然使用函数指针并不是必须的——也就是说,如果你愿意,你可以直接在if-then子句中调用start_file_name1(argc,argv) [等等]。至于有两个main()函数,你实际上不能这样做,因为你会得到一个链接错误(重复的函数名)。但是你可以有几个类似于main()的函数,但它们被称为其他名称,并且main()调用它们(就像你的示例中一样)。 - Jeremy Friesner
@JohnFeminella 那句话实际上来自老子。 - yuan yuan
13个回答

40

不行。所有程序都只有一个main()函数,这是编译器和链接器生成可执行文件时使用的一个合理的起点。

基本上你有两个选择:

  1. 让main()解释一些命令行参数来决定调用哪个实际的main函数。缺点是你将得到一个同时包含两个程序的可执行文件。

  2. 将共享的代码制作成库,并编译每个main文件与该库对应。这样你会得到两个可执行文件。


这个怎么样? http://www.geeksforgeeks.org/output-of-a-program-set-2/ int main() { static int i=5; if(--i){ main(); printf("%d ",i); }
}
- Sourav Nanda
1
这个答案是不正确的。虽然 main 只有一个具有外部链接的定义,但 C 标准并没有明确禁止使用内部链接(用 static 声明)的其他定义。至少在 Apple LLVM 10.0.0 with clang-1000.11.45.5 中,可以接受这种定义并生成可执行文件,尽管会有警告。 - Eric Postpischil

20

你可以有两个名为main的函数。这个名称没有任何特殊含义,也不是保留字。特殊的是函数,它碰巧有这个名称。这个函数是全局的。因此,如果你在其他命名空间中编写了一个主函数,你将拥有第二个main函数。

namespace kuppusamy {
  int main() { return 0; } 
}

int main() { kuppusamy::main(); }

第一个 main 函数并不特殊 - 请注意您必须显式使用 return


5
不,真正的main()函数并不需要返回值,默认为0。 - Chinmay Kanchi
2
Chinmay:准确地说,::main不需要返回语句,它默认为return 0;return;无效)。而且返回类型必须保持int。以任何方式使用此功能除了指出::main的特殊之处外都是可疑的,可能会有所不同。 - Roger Pate
1
名称确实很特殊且被保留,但它是::main而不是main(就像::_a被保留但ns::_a不被保留一样)。我不确定原帖作者是否真正理解他可以进行这种区分,更不用说他应该这样做了。 - Roger Pate
1
@Roger,请注意您可以在全局命名空间中声明struct main { };,这证明了::main不是保留给主函数的名称的说法是错误的 :) - Johannes Schaub - litb
1
从技术上讲,这并没有定义一个名为 main 的第二个函数:命名空间名称被编码为符号名称,而唯一的 main() 才是真正被称为 main 的符号。 - cmaster - reinstate monica
显示剩余6条评论

12

是的,但它是特定于平台而不是标准C,如果您询问您真正想要实现的目标(而不是这个问题的尝试解决方案),那么您可能会收到更有帮助的答案。


1
“weak symbols”的链接并不能真正支持你的说法,最终程序仍然只有一个入口点到一个main()函数。具体的main符号将简单地覆盖弱符号。 - Clifford
6
“我能用C或C++编写具有两个主函数的程序吗?”是的,源代码即C/C++程序将具有两个主函数。编译后的版本(机器码程序)仍然将具有两个主函数。链接后的版本实际上在计算机上运行时只会有一个。但是,我的真正回答要点是他问错了问题,对它的回答几乎肯定无关紧要,他应该问另一个问题。 - Roger Pate

6
不,一个程序只能有一个入口点(即main())。事实上,在C语言中,通常情况下,你只能有一个特定名称的函数。

4

如果一个变量是static并且位于不同的源代码文件中,我看不出任何问题。


3

main()定义了程序的入口点,你的程序中只能有一个main()函数(入口点)。

坦白地说,我对你的问题并不太理解。


3
我认为这个问题非常合理。有人只是想知道为什么会这样。 - Aniansh

2

“主函数”是什么意思?如果你指的是程序启动时执行的第一个函数,那么你只能有一个。(你只能有一个第一项!)

如果你想让应用程序在启动时执行不同的功能,你可以编写一个主函数来读取命令行(例如),然后决定调用哪个其他函数。


2
在一些非常特殊的架构中,你可以这样做。这就是Cell处理器的情况,其中你有一个主处理器的主程序(64位PowerPC处理器元素称为PPE),以及8个不同协处理器(32位Synergistic Processing Element称为SPE)的一个或多个主程序。

1
这不就是九个独立的程序,而不是一个有九个入口点的程序吗?! - Clifford
你说的没错,但更准确的表示方式是将SPE表示为一个“物理线程”,其中SPE主函数将成为该线程的入口点。(这将变成多进程多线程的辩论^^) - Phong

1

不行,在C语言中你不能有多个main()函数。在标准的C语言中,main()函数是一个特殊的函数,被定义为程序的入口点。无论你在C语言或其他任何编程语言中创建了什么样的函数,除非你指定不同的函数签名,否则都不能有多个副本存在。但在main()函数的情况下,我想你别无选择;)


0

不,main()是程序的入口点,因为你不能有两个入口点,所以你不能有两个main()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接