2012-01-01 14 views
1

可能重复:
What is the proper declaration of main?样式用C

我的工作我的C技能,我已经注意到,

INT主(INT ARGC ,char * argv [])

回报(EXIT_SUCCESS)

,而不是

INT主要(),并返回0

这是为什么?

+0

虽然这里有两个问题。 – 2012-01-01 06:48:07

+0

@ChristianJonassen:常见问题也讨论从main()返回。 – 2012-01-01 06:48:50

+0

你说得对。这个问题是重复的。 – 2012-01-01 06:54:29

回答

9

如果你要忽略参数列表,它是合理的,合理的使用方法:

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) { /* ... */ } 

或两个参数(这里称为argcargv,虽然任何名称可能是 使用,因为它们是本地的在其中声明它们的功能):

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返回类型,并且文档可能会限制允许的内容。

+0

+1,但也许应该补充说'main'不返回'int'的属性是“特定于实现”。那首先不是编译器生产者选择返回类型的用户,其次是编译器文档中必须明确指定。 – 2012-01-01 10:09:00

1

int main (int argc, char * argv [])是用于当你想采取命令行参数。

EXIT_SUCCESS只是一个#define这比0更具描述性。

1

int main(int argc, char *argv[])允许用户在程序执行时输入参数,即程序名称后在控制台中写入的文本。

return (EXIT_SUCCESS)是万一一个O.S.不期望0作为成功退出的值:它可以是任何其他值,但在大多数情况下,EXIT_SUCCESS等于0.

+0

即使返回到调用环境的值通常不会将0视为成功(在这种情况下,0被映射为将会返回的值),但从主或调用'exit(0)'返回0必须被解释为成功退出被视为成功)。在我的回答中查看C99标准中的引号。 – 2012-01-01 06:49:43

1

(该两件事情你问什么都没有做对方。)

要回答你的第一个问题: 有INT主要()只是意味着该计划不接受命令行参数。 当它接受两个参数时,argc是参数计数(它总是大于或等于1,因为第一个参数将是程序本身的路径或名称),而argv是参数列表。

要回答你的第二个问题: EXIT_SUCCESS是保证被底层操作系统解释为成功。