我的工作我的C技能,我已经注意到,
INT主(INT ARGC ,char * argv [])
和
回报(EXIT_SUCCESS)
,而不是
INT主要(),并返回0
这是为什么?
我的工作我的C技能,我已经注意到,
INT主(INT ARGC ,char * argv [])
和
回报(EXIT_SUCCESS)
,而不是
INT主要(),并返回0
这是为什么?
如果你要忽略参数列表,它是合理的,合理的使用方法:
int main(void) { ... }
的标准保佑这个用法,还有一个带参数。如果您编译为-Wstrict-prototypes
并且不包含void
,那么您会收到GCC的警告,因此我编写void
。这里的C++不同。
至于return EXIT_SUCCESS;
,一般来说似乎没什么好处;我继续在main()
函数的末尾写上return 0;
,即使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.3exit函数
¶5最后,控制返回到主机环境。如果状态值为零或返回EXTERN_SUCCESS,则状态成功终止的实现定义形式为 。如果状态值为EXIT_FAILURE,则返回状态不成功终止的实现定义表格 。否则,返回的状态是实现定义的 。
除了:请注意,§5.1.2.2.3清楚地表明,C标准允许实现,以允许返回类型其他main()
比int
(不像C++标准,其中明确禁止比int
其他返回类型)。但是,正如Jens正确指出的那样,只有当实现明确声明允许时,才允许从main
返回非int
返回类型,并且文档可能会限制允许的内容。
+1,但也许应该补充说'main'不返回'int'的属性是“特定于实现”。那首先不是编译器生产者选择返回类型的用户,其次是编译器文档中必须明确指定。 – 2012-01-01 10:09:00
int main (int argc, char * argv [])
是用于当你想采取命令行参数。
EXIT_SUCCESS
只是一个#define
这比0
更具描述性。
int main(int argc, char *argv[])
允许用户在程序执行时输入参数,即程序名称后在控制台中写入的文本。
return (EXIT_SUCCESS)
是万一一个O.S.不期望0作为成功退出的值:它可以是任何其他值,但在大多数情况下,EXIT_SUCCESS等于0.
即使返回到调用环境的值通常不会将0视为成功(在这种情况下,0被映射为将会返回的值),但从主或调用'exit(0)'返回0必须被解释为成功退出被视为成功)。在我的回答中查看C99标准中的引号。 – 2012-01-01 06:49:43
操作系统可以在程序指示操作成功的方式上有所不同。理想情况下,宏EXIT_SUCCESS
扩展为适合编译该程序的系统的值。
(该两件事情你问什么都没有做对方。)
要回答你的第一个问题: 有INT主要()只是意味着该计划不接受命令行参数。 当它接受两个参数时,argc是参数计数(它总是大于或等于1,因为第一个参数将是程序本身的路径或名称),而argv是参数列表。
要回答你的第二个问题: EXIT_SUCCESS是保证被底层操作系统解释为成功。
虽然这里有两个问题。 – 2012-01-01 06:48:07
@ChristianJonassen:常见问题也讨论从main()返回。 – 2012-01-01 06:48:50
你说得对。这个问题是重复的。 – 2012-01-01 06:54:29