c语言prog.c: in function 'main':,关于重载:我们可以在C ++中重载main()函数吗?

本问题已经有最佳答案,请猛点这里访问。

由于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不能重载它会产生编译时错误,因为你不能有多个入口点为同一个程序如上所述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值