我正在研究我的C技能,我注意到了
int main(int argc,char * argv [])
和
返回(EXIT_SUCCESS)
而不是
int main()并返回0
为什么会这样?
答案 0 :(得分:11)
如果你要忽略参数列表,使用它是合理和明智的:
int main(void) { ... }
标准保佑这种用法,以及带参数的标准。如果您使用-Wstrict-prototypes
进行编译并且不包含void
,则会收到来自GCC的警告,因此我写了void
。 C ++与此不同。
至于return EXIT_SUCCESS;
,一般来说似乎没什么好处;我继续在return 0;
函数的末尾写main()
,即使C99允许你省略任何返回(然后它的行为就像你写了return 0;
)。
ISO / IEC 9899:1999
§5.1.2.2.1程序启动
¶1程序启动时调用的函数名为
main
。实施宣布否 这个功能的原型。它应定义为返回类型int
且没有 参数:int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):int main(int argc, char *argv[]) { /* ... */ }
或等效的; 9)或其他一些实现定义的方式。
9)因此,
int
可以替换为定义为int
的typedef名称,或者argv
的类型可以写为char ** argv
,等等。§5.1.2.2.3程序终止
¶1如果
main
函数的返回类型是与int
兼容的类型,则返回 对main
函数的初始调用等同于使用值调用exit
函数 由main
函数返回作为其参数; 10)到达}
终止main
函数返回值0.如果返回类型与int
不兼容,则为。{ 返回到主机环境的终止状态未指定。10)根据§6.2.4,具有自动存储持续时间的对象的生命周期在
main
中声明 将在前一种情况下结束,即使他们不会在后一种情况下。§7.20.4.3退出功能
¶5最后,控制权返回给主机环境。如果status的值为零或 EXIT_SUCCESS,一种实现定义的状态成功终止形式 回。如果status的值为EXIT_FAILURE,则为实现定义的表单 返回状态不成功的终止。否则返回的状态是 实现定义的。
除此之外:请注意,§5.1.2.2.3清楚地表明C标准允许实现允许除main()
以外的int
的返回类型(与C ++标准明确不同)禁止除int
以外的返回类型。但是,正如Jens正确指出的那样,只有在实现明确记录允许的情况下才允许来自int
的非main
返回类型,并且文档可能会限制是允许的。
答案 1 :(得分:1)
int main (int argc, char * argv [])
用于获取命令行参数。
EXIT_SUCCESS
只是#define
,比0
描述性更强。
答案 2 :(得分:1)
int main( int argc, char *argv[] )
允许用户在执行程序时输入参数,即在程序名称后在控制台中写入的文本。
return (EXIT_SUCCESS)
以防万一。不希望0作为成功退出的值:它将是任何其他值,但在大多数情况下,EXIT_SUCCESS等于0.。
答案 3 :(得分:1)
操作系统可以在程序指示成功操作方面有所不同。宏EXIT_SUCCESS
理想地扩展为适合编译程序的系统的值。
答案 4 :(得分:1)
(你提出的两件事与彼此无关。)
回答你的第一个问题: 使用int main()只意味着程序不接受命令行参数。 当它接受两个参数时,argc是参数count(它将始终大于或等于1,因为第一个参数将是程序本身的路径或名称),而argv是参数列表。
回答你的第二个问题: EXIT_SUCCESS 保证被底层操作系统解释为成功。