19

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

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 *[]?

4

3 回答 3

6

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

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

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

实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。

于 2013-11-06T03:28:15.583 回答
5

extern "C"只专门告诉 C++ 编译器不要在生成的函数标签上装饰或使用名称争论。

是的,两者都是合法的。

于 2013-11-06T03:27:24.183 回答
4

该标准支持两种形式main

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

这些形式是任何实现都必须承认的。其他一切都是您的代码实现简单并让您发挥创造力。这并不违法,因为该标准明确允许它识别其他形式的main.

启动代码通常以允许它调用main没有链接声明的方式编写,因为这就是标准所说的main方式。编译器通常特别对待main具有标准允许的 C 链接,所以这就是启动代码声明它的方式。这对普通程序员来说是不感兴趣的。他只需要遵循标准。

于 2013-11-06T04:26:16.823 回答