繁体   English   中英

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

[英]Is it legal C++ to declare main as extern “C”?

作为一个低级程序员,我经常使用可执行文件的模块启动代码,所以我很清楚像“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)

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

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

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

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

实现不应预定义主函数。 此功能不应过载。 它应该具有int类型的返回类型,否则其类型是实现定义的。

标准祝福两种形式的main

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

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

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

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

是的,两者都是合法的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM