由于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
的重载?如果是这样,哪个陈述?
答案 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不能重载它会产生编译时错误,因为你不能为上面说的同一个程序提供多个入口点。