【问题标题】:Styles of main functions in C [duplicate]C中主要函数的样式
【发布时间】:2012-01-31 07:17:00
【问题描述】:

可能重复:
What is the proper declaration of main?

我正在学习我的 C 技能,我注意到了

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

返回 (EXIT_SUCCESS)

而不是

int main() 并返回 0

这是为什么?

【问题讨论】:

  • 这里提出了两个问题。
  • @ChristianJonassen:FAQ 问题还讨论了从main() 返回。
  • 你是对的。这个问题是重复的。
  • 我不敢苟同(所以我认为这个问题不是关于 C++ main() 函数的问题的重复)。另一个问题专门关于 C++ 并且与 C 的等效答案有明显差异(最值得注意的是,C 标准确实允许 main() 的返回类型不同于 int - 请参阅我的答案 - 而 C++ 绝对不允许)。

标签: c coding-style


【解决方案1】:

如果你要忽略参数列表,使用它是合理和明智的:

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.3 退出函数

¶5 最后,控制权返回到主机环境。如果 status 的值为零或 EXIT_SUCCESS,状态成功终止的实现定义形式是 回来。如果 status 的值为 EXIT_FAILURE,则为实现定义的形式 状态不成功终止的返回。否则返回的状态为 实现定义。

旁白:请注意,§5.1.2.2.3 清楚地表明 C 标准允许实现允许 main() 的返回类型,而不是 int(与 C++ 标准不同,它明确禁止返回类型除了int)。但是,正如Jens 正确指出的那样,只有在实现明确记录允许的情况下,才允许来自main 的非int 返回类型,并且文档可能会对允许的内容进行限制。

【讨论】:

  • +1,但也许应该补充一点main 不返回int 的属性是“特定于实现的”。那就是首先编译器生产者选择返回类型的不是用户,其次这个必须在编译器文档中明确说明。
【解决方案2】:

int main (int argc, char * argv []) 用于您想要获取命令行参数的时候。

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

【讨论】:

    【解决方案3】:

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

    return (EXIT_SUCCESS) 以防操作系统不期望 0 作为成功退出的值:它可以是任何其他值,但在大多数情况下,EXIT_SUCCESS 等于 0。

    【讨论】:

    • 从 main 返回 0 或调用 exit(0) 必须被解释为成功退出,即使返回到调用环境的值通常不会将 0 视为成功(在这种情况下,0 被映射将被视为成功的事情)。请参阅我的回答中引用的 C99 标准。
    【解决方案4】:

    操作系统在程序如何指示成功操作方面可能有所不同。理想情况下,宏 EXIT_SUCCESS 会扩展为适合编译程序的系统的值。

    http://en.wikipedia.org/wiki/Exit_status

    【讨论】:

      【解决方案5】:

      (你问的两件事没有任何关系。)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        相关资源
        最近更新 更多