慕森王
标准C对于宿主环境(这是正常的),C99标准说:5.1.2.2.1启动程序在程序启动时调用的函数名为main..该实现没有声明此函数的原型。它应定义为返回类型为int在没有参数的情况下:int main(void) { /* ... */ }或者有两个参数(在这里称为argc和argv(虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):int main(int argc, char *argv[]) { /* ... */ }或同等;9)或者以其他实现定义的方式。9)因此,int可以用定义为int的类型argv可以写成char **argv等等。C11和C18标准基本上与C99标准相同。标准C+C+98标准规定:3.6.1主要功能[basic.start.main]1程序应包含一个称为Main的全局函数,它是程序的指定开始。[.]2实施不应预定义主要职能。此功能不应超载。它应该有一个int类型的返回类型,但否则它的类型是定义的。所有实现都应允许Main的以下两种定义:int main() { /* ... */ }和int main(int argc, char* argv[]) { /* ... */ }C+标准明确表示“它[主函数]应该有一个int类型的返回类型,但否则它的类型是实现定义的”,并且需要与C标准相同的两个签名。因此,C+标准直接不允许使用“voidmain()”,尽管它无法阻止非标准一致性实现允许替代品(也不允许标准一致性实现作为标准的扩展)。C+03、C+11、C+14和C+17标准与C+98基本相同。公共延伸传统上,Unix系统支持第三种变体:int main(int argc, char **argv, char **envp) { ... }第三个参数是指向字符串的以空结尾的指针列表,每个字符串都是一个环境变量,它有一个名称、一个等号和一个值(可能是空的)。如果您不使用这个,您仍然可以通过extern char **environ;“”很长一段时间以来,它没有一个标头来声明它,但是POSIX 2008标准现在要求它在<unistd.h>.C标准承认这是一项共同的扩展,载于附件J:J.5.1环境论点在宿主环境中,主函数接收第三个参数,char *envp[],它指向以空结尾的指针数组。char,每个字符串指向一个字符串,该字符串提供有关此程序执行环境的信息(5.1.2.2.1)。微软C这个微软诉2010编译器很有趣。该网站说:main的声明语法是 int main();或者,可以选择,int main(int argc, char *argv[], char *envp[]);或者,main和wmain函数可以声明为返回。void(无返回值)。如果你宣布main或wmain作为返回空,您不能使用返回语句将退出代码返回到父进程或操作系统。若要返回退出代码,请执行以下操作:main或wmain被宣布为void,您必须使用exit功能。对于我来说,不清楚当程序返回到父程序或o/s时会发生什么(退出代码返回给父程序或o/s)。void main()退出-和MS网站也是沉默的。有趣的是,MS没有规定main()C和C+标准所要求的。它只规定了三个参数形式,其中第三个参数是char **envp指向环境变量列表的指针。微软的网页还列出了其他一些选择-wmain()这需要很宽的字符串,还有更多。Microsoft与2005版本的本页不列void main()作为另一种选择。这个版本从微软到2008年以后。是int main()同int main(void)?有关详细分析,请参阅我对什么应该main()返回C和C+..(我似乎曾经认为这个问题指的是C+,尽管它没有而且从来没有提到过。在C+中,int main()和int main(void)和int main()是习语C+)在C中,这两种符号之间有区别,但您只注意到在深奥的情况下。具体来说,如果您调用main()函数从您自己的代码中执行,您可以在C中执行,而在C+中不允许这样做。这个int main()表示法不提供main(),但只有当您递归地调用它时,这才重要。带着int main(),您可能稍后(在同一个函数中或在另一个函数中)写入int rc = main("absolute", "twaddle", 2):在形式上,编译器不应该抱怨到拒绝编译代码的程度,尽管它可能会合理地抱怨(警告您)(并使用-WerrorGCC将把警告转化为错误)。如果你用int main(void)的后续呼叫main()应该产生一个错误-你说过这个函数不带参数,但试图提供三个。当然,你不能合法地打电话main()在声明或定义它之前(除非您仍然使用C90语义)-而且实现不声明原型main()..注:C11标准说明了两者int main()和int main(void)在不同的例子中,两者在C中都是有效的,尽管它们之间有细微的区别。