哦,诡计问题!
简短回答:“视情况而定。”
长答案:正如其他人指出的那样,您可以拥有多个名为 main 的函数,只要它们位于不同的命名空间中,并且仅使用根命名空间中的 main(即 ::main)作为主程序。事实上,一些线程库的线程类有一个名为 main 的方法,库用户用他们希望在线程中运行的代码覆盖该方法。
现在,假设您没有使用任何命名空间技巧,如果您尝试在两个不同的 .cpp 文件中定义 ::main,则文件本身都会编译,但是,链接器将中止,因为有两个名为main;它不知道要链接哪个。
(我有一个问题请教大师:在 C++ 中,函数定义 int main() {} 和 extern "C" int main() {} 是否生成具有相同签名的函数?我自己没有尝试过。)
现在您的程序源代码中可以有多个::main:如果一个main 在库(.a 或 .so 文件)中,另一个在在您的源 (.o) 文件中,您的源中的那个获胜,而库中的那个被删除,并且链接成功,除非还有其他问题!如果您没有写main,图书馆的main 会赢。这实际上是在 lex 和 yacc 附带的支持库中完成的;他们提供了一个准系统main,因此您不必为快速解析器编写一个。
这导致了一个有趣的应用程序:为每个库提供一个main。我的库往往很小而且很集中,所以我在每个库中都放了一个main.cpp 和一个main,它是库的测试或实用程序代码。例如,我的共享内存库有一个main,它允许从命令行调用管理共享内存的所有函数。然后我可以用bash 脚本测试各种情况。任何链接到共享内存库的东西都可以免费获得测试代码,或者可以通过定义自己的main 来处理它。
编辑:为了确保人们清楚这个概念,我正在谈论一个看起来像这样的构建:
gcc -c -o bar_main.o bar_main.cpp
ar -r libbar.a bar_main.o
ranlib libbar.a
gcc -c -o foo_main.o foo_main.cpp
gcc -o foo foo_main.o -L. -lbar
在此示例中,foo_main.o 中的 main 优于 bar_main.o 中的 main。该标准没有定义这种行为,因为他们不在乎。无论如何,人们都会使用很多非标准的东西。 Linux 就是一个使用 C 位域的例子。 ld 以这种方式工作的时间比我知道如何打字的时间长。
说真的,伙计们,如果您需要生成最小公分母代码,请随意严格遵守标准。但是,如果您有幸在可以构建lex 和yacc 程序的平台上工作,那么一定要考虑利用它。