10

我有一些 C 程序没有从 main 显式返回,如下所示:

int main(int argc, char *argv[])
{
  // blah blah
}

如果我使用 GCC 4.6.3 和以下选项编译它们:

gcc file.c -Wall -Wextra

程序不会返回 0 并给我带来问题,但标准(以及许多其他关于 SO 的答案)说:

如果 main 函数的返回类型是与 int 兼容的类型,则从初始调用到 main 函数的 return 等效于以 main 函数返回的值作为参数调用 exit 函数;[10]到达 }终止主函数的返回值 0。如果返回类型与 int 不兼容,则返回给宿主环境的终止状态是未指定的。

[10] 根据 6.2.4,在 main 中声明的具有自动存储持续时间的对象的生命周期将在前一种情况下结束,即使在后者中它们不会有。

我的程序返回不同的值,160、15、14……垃圾?

我错过了什么吗?这是 GCC 错误吗?在 GCC 在线文档中找不到任何内容。GCC 是否仍然引用一些旧的 C 标准(C99 之前),而这些标准不能被指定?

4

1 回答 1

14

默认情况下gcc-std=gnu89C90 + GNU 扩展。

C90 说:

(C90, 5.1.2.2.3) “如果主函数执行一个没有指定值的返回,返回到宿主环境的终止状态是未定义的”

当在 main 函数中省略return 时,编译时使用-std=c99-std=gnu99具有返回值。0

于 2012-10-17T14:23:17.860 回答