将main声明为extern“C”是合法的C ++吗?

时间:2013-11-06 03:24:42

标签: c++ main extern linkage

作为一名低级程序员,我经常使用可执行文件的模块启动代码,所以我很清楚“crt0”之类的代码是如何工作的。在编写C ++代码时,我通常将main声明为extern "C",以匹配C启动代码要调用main的内容。因此,我通常将此声明用于main(如果专门针对Windows,则为wmain):

extern "C" int main(int argv, const char *const *argv)

extern "C" int __cdecl wmain(int argv, const wchar_t *const *argv)

extern "C"上使用main是否合法?此外,const char *const *对于argv的类型是合法的,而不是char *[]

3 个答案:

答案 0 :(得分:6)

链接是实现定义的(3.6.1p3):

  

main的链接(3.5)是实现定义的。

另外,对于你的后一个问题,const char* const*(3.6.1p2)是完全可以接受的:

  

实现不应预定义主函数。这个功能   不得超载。它应该具有int类型的返回类型,但是   否则它的类型是实现定义的。

答案 1 :(得分:4)

标准祝福两种形式的main

int main()
int main(int argc, char* argv[])

这些表单是任何实现必须识别的。其他任何事情都可以通过您的代码轻松实现,让您充满创意。这并非违法,因为该标准明确允许其识别其他形式的main

启动代码通常以允许它调用没有链接声明的main的方式编写,因为标准说main应该如此。编译器通常将main特别视为具有C链接,如标准所允许的那样,因此启动代码如何声明它。这对普通程序员来说并不重要。他只需要遵循标准。

答案 2 :(得分:3)

extern "C"只告诉C ++编译器没有在生成的函数标签上进行装饰或使用名称争用。

是的,两者都是合法的。