我们可以在C ++中重载main()函数吗?

时间:2011-03-12 11:16:19

标签: c++ overloading main standards

由于C +++允许函数重载,我们可以重载main()吗?

例如,

int main(const std::string &)
{
   return 0;
}
int main(int argc, char *argv[])
{
  return main("calling overloaded main");
}

gcc-4.3.4无法编译,并会出现以下错误:(请参阅ideone

  

prog.cpp:4:错误:'int main(const std :: string&)'的第一个参数应为'int'
  prog.cpp:4:错误:'int main(const std :: string&)'只接受零或两个参数
  prog.cpp:在函数'int main(int,char **)'中:
  prog.cpp:8:错误:C函数'int main(int,char **)'的声明与
的冲突   prog.cpp:4:错误:上一个声明'int main(const std :: string&)'这里
  prog.cpp:在函数'int main(int,char **)'中:
  prog.cpp:10:错误:从'const char *'到'int'的转换无效
  prog.cpp:8:错误:函数'int main(int,char **)'的参数太少了   prog.cpp:10:错误:此时在文件中

所以我想知道C ++标准显式是否禁止main的重载?如果是这样,哪个陈述?

3 个答案:

答案 0 :(得分:25)

是的,明确禁止这样做。参见3.6.1p2

  

实现不应预定义主函数。此功能不应过载。


这样,主要功能的名称可以保持不受限制。也就是说,运行时库可以调用具有固定名称的符号(例如main_main)来跳转到main函数。库的代码不需要依赖于程序的main函数具有的参数列表。

还允许实现为main函数定义其他有效参数列表(例如,POSIX规范为环境变量指定char **env参数)。当main的重载是“非主函数”或它是否是“主函数”时是不明确的,因此是一个入口点。据推测,如果您要声明多个入口点,您会想要收到错误,因此这些问题很重要。

答案 1 :(得分:0)

您所做的是宣布程序执行的两个入口点。这是编译器禁止的,因为当你运行程序时,程序将不知道从哪里开始!

我也看不出你在应用程序设计中想要这样做的原因。

答案 2 :(得分:-1)

据我所知全局主函数(所有类之外的主函数)不能在c ++中重载,但是如果你在一个类中编写main函数那么它将编译好但是它不会被视为节目录入点 例如,以下代码不会编译文件名mainoverloaderror.cpp

#include<iostream>
using namespace std;
int main(int noofarg,char *values[])
{
    std::cout<<"hello "<<endl<<values[0]<<endl<<values[1]<<endl<<noofarg;
    return 0;
}
int main()
{
 std::cout<<"hello main()";
    return 0;
}

编译错误: mainoverloaderror.cpp:在函数'int main()'中: mainoverloaderror.cpp:13:错误:C函数'int main()'的声明与 mainoverloaderror.cpp:7:错误:上一个声明'int main(int,char **)'here

在类中查看此代码主函数。虽然它没有多个入口点,但编译得很好:

#include<iostream>

using namespace std;

class MainClass{

        int main1()
    {

        std::cout<<"hello main()"<<endl;
        return 0;
    }
    int main(int noofarg,char *values[])
    {

        std::cout<<"hello "<<endl<<values[0]<<endl<<values[1]<<endl<<noofarg;
        return 0;
    }
    int main()
    {

     std::cout<<"hello main()";
        return 0;

    }
};

int main()
{

 std::cout<<"hello main()";
    return 0;

}

所以得出结论:在c ++中,全局main不能重载它会产生编译时错误,因为你不能为上面说的同一个程序提供多个入口点。