两个主要功能

时间:2010-04-13 02:05:37

标签: c++ main

我们可以在C ++程序中有两个main()函数吗?

8 个答案:

答案 0 :(得分:19)

该标准明确在3.6.1中说明:

  

程序应包含一个名为main的全局函数,它是程序的指定开始。 [...] 此功能不应过载。

因此,程序中的全局范围中只能有一个main函数。其他范围中也称为main的函数不受此影响,可以有任意数量。

答案 1 :(得分:11)

只有一个函数可以在任何名称空间之外命名为main,就像任何其他名称一样。如果您有名称空间foobar(等),那么您可以很好地拥有名为foo::mainbar::main等功能,但它们不会被视为任何内容从系统的角度来看是特殊的(只有名称为main的函数才会被特别处理,作为程序的入口点)。当然,从您的main开始,您可以很好地调用各种foo::mainbar::main,等等。

答案 2 :(得分:8)

是的!为什么不呢?

请考虑以下代码:

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

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

将在执行期间调用它的::main()

答案 3 :(得分:4)

您不能在全局范围内重载main()。

答案 4 :(得分:3)

一个程序只能有一个入口点,但当然一个main()函数可以根据你需要指定的逻辑调用其他函数。因此,如果您正在寻找一种方法将两个或多个程序有效地编译为单个可执行文件,您可以执行以下操作:

int main(int argc, char ** argv)
{
   if (argc > 0)  // paranoia
   {
           if (strstr(argv[0], "frogger")) return frogger_main(argc, argv);
      else if (strstr(argv[0], "pacman"))  return pacman_main(argc, argv);
      else if (strstr(argv[0], "tempest")) return tempest_main(argc, argv);
   }

   printf("Hmm, I'm not sure what I should run.\n");
   return 10;
}

...然后只需将你的'其他'main()函数重命名为frogger_main(),pacman_main()或你想要给它们的任何名称,如果可执行文件名,你将拥有一个以Frogger运行的程序其中有“frogger”这个词,如果可执行文件中有“pacman”等,则以PacMan身份运行,等等。

答案 5 :(得分:2)

在一个程序中,只允许一个入口点。

答案 6 :(得分:1)

哦,特技提问!

简短回答:“这取决于。”

答案很长:正如其他人所指出的那样,只要它们位于不同的名称空间中,您就可以拥有多个名为main的函数,并且只有根名称空间中的main(即::main })用作主程序。实际上,一些线程库的线程类有一个名为main的方法,库用户用它们想要在线程中运行的代码覆盖它。

现在,假设你没有做任何命名空间技巧,如果你试图在两个不同的::main文件中定义.cpp,那么文件本身都会编译,但是,链接器会因为那里而中止是两个名为main的定义;它无法分辨哪个链接。

(我对那些大师的问题是:在C ++中,函数定义int main() {}extern "C" int main() {}是否生成具有相同签名的函数?我自己没有尝试过。)

现在你可以在你的程序源代码中拥有多个::main :如果一个main在库中(.a或.so文件) ,另一个在你的源(.o)文件中,你的源中的那个文件被删除,库中的那个文件被删除,和链接成功除非还有其他一些问题!如果您没有撰写main,那么图书馆的main就会获胜。这实际上是在lexyacc附带的支持库中完成的;它们提供了一个准系统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 来处理它。

编辑:只是为了确保人们对这个概念很清楚,我说的是一个看起来像这样的构建:

main

在此示例中,foo_main.o中的mainbar_main.o中的ld更好。该标准没有定义此行为,因为他们不关心。无论如何,人们都会使用很多非标准的东西; Linux就是一个使用C位域的例子。 lex的工作时间比我知道如何打字要长。

说真的,如果您需要编制最小公分母代码,请随意严格遵守标准。但是,如果您能够在可以构建yacc和{{1}}程序的平台上工作,那么请考虑利用它。

答案 7 :(得分:0)

全局范围内只有一个入口点。