作为一名低级程序员,我经常使用可执行文件的模块启动代码,所以我很清楚“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 *[]
?
答案 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 ++编译器没有在生成的函数标签上进行装饰或使用名称争用。
是的,两者都是合法的。