本问题已经有最佳答案,请猛点这里访问。
由于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: error: first argument of ‘int main(const std::string&)’ should be ‘int’
prog.cpp:4: error: ‘int main(const std::string&)’ takes only zero or two arguments
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:8: error: declaration of C function ‘int main(int, char**)’ conflicts with
prog.cpp:4: error: previous declaration ‘int main(const std::string&)’ here
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:10: error: invalid conversion from ‘const char*’ to ‘int’
prog.cpp:8: error: too few arguments to function ‘int main(int, char**)’
prog.cpp:10: error: at this point in file
所以我想知道C ++标准是否明确禁止main的重载? 如果是这样,哪个陈述?
是的,它明确禁止这样做。参见3.6.1p2
An implementation shall not predefine the main function. This function shall not be overloaded.
这样,主函数的名称可以保持不变。也就是说,运行时库可以调用具有固定名称(例如main或_main)的符号来跳转到main函数。库的代码不需要依赖于程序的main函数具有的参数列表。
该实现还允许为main函数定义其他有效参数列表(例如,POSIX规范为环境变量指定char **env参数)。当main的重载是"非主函数"或它是否是"主函数"时,不清楚是什么,因此是一个入口点。据推测,如果您要声明多个入口点,您会想要收到错误,因此这些问题很重要。
你对此有引用吗?
@bdonlan:www-d0.fnal.gov/~dladams/cxx_standard.pdf例如(ISO / IEC 14882:1998(E))
懒惰我 我应该查阅标准本身。+1。
你能澄清一下你对POSIX的看法吗? 你是说它允许第三个参数为main? 我查看了exec的规范,并提到了一个特殊的extern char** environ作为变量。
你所做的是宣布程序执行的两个入口点。这是编译器禁止的,因为当你运行程序时,程序将不知道从哪里开始!
我也看不出你为什么要在你的应用程序设计中这样做的原因。
好吧,人们可以想象这样一个系统是如何工作的。 程序将通过调用相应表单的唯一main()开始。 所以它会选择int main(int argc, char *argv[])形式之一。 显然,这种情况不会发生,但如果可取的话,想象它可能并不难。
按照我的说法,全局主函数(所有类之外的主函数)不能在c ++中重载,但是如果你在一个类中编写main函数那么它将编译好但是它不会被视为程序入口点
例如,以下代码将不会编译文件名mainoverloaderror.cpp
#include
using namespace std;
int main(int noofarg,char *values[])
{
std::cout<
return 0;
}
int main()
{
std::cout<
return 0;
}
编译错误:
mainoverloaderror.cpp:在函数'int main()'中:
mainoverloaderror.cpp:13:错误:C函数'int main()'的声明与
mainoverloaderror.cpp:7:错误:前面的声明'int main(int,char **)'在这里
看一下类中的代码main函数。虽然它不会有多个入口点,但编译正常:
#include
using namespace std;
class MainClass{
int main1()
{
std::cout<
return 0;
}
int main(int noofarg,char *values[])
{
std::cout<
return 0;
}
int main()
{
std::cout<
return 0;
}
};
int main()
{
std::cout<
return 0;
}
所以得出结论:在c ++中,全局main不能重载它会产生编译时错误,因为你不能有多个入口点为同一个程序如上所述。