【问题标题】:Why do I see so much C code that omits a return type for main? Why does it work?为什么我看到这么多 C 代码忽略了 main 的返回类型?为什么它有效?
【发布时间】:2014-08-10 19:54:38
【问题描述】:

我去了这个在线编译C的website,看到main函数声明没有返回类型。

我知道有关此主题here 的一些问题,但我没有找到任何关于省略返回类型的问题。我尝试使用 gcc 编译代码并且成功了。

这是否意味着如果我们不对main 设置返回类型,它将假定它是int(或任何其他类型)?

【问题讨论】:

  • 非常接近,但不是完全相同的副本——至少不是我阅读它的方式。这个问题是关于不返回值(例如 0)的主要函数,就像它们应该返回的那样。这个问题是关于没有用返回类型声明的主要函数。 (虽然如果这个 不是 something 的副本,我会感到惊讶。)
  • 不重复,我知道如果你省略 RETURN STATEMENT 它返回 0,我说的是 OMITTING TYPE IN SIGNATURE

标签: c main


【解决方案1】:

C89 标准为了保持与 C 的原始 K&R 版本(没有我们现在所知道的函数原型)的兼容性,允许函数隐式返回 int。编译器假定在没有显式返回类型(即voidfloat 等)的情况下声明的任何函数都返回int

因此,当 main 函数被声明为没有返回类型时,它被假定为返回类型 int。一切都很好,因为根据标准,main应该返回int

但是,这在 C99 中发生了变化。默认/隐式 int 规则已从语言规范中删除。不再假定没有显式返回类型的函数返回 int

这意味着对于任何现代编译器,遵守当前版本的 C 语言规范,没有返回类型的 main 声明是无效的。

至于为什么它可以在 GCC 上工作,这是因为默认情况下,GCC 仍然遵循 C89/C90 标准,除非您明确指定 -std=c99 作为编译器标志。为什么你仍然在网上看到这个,嗯,有两个原因。第一个是我已经给出的:它在旧版本的语言规范中是合法的,并且许多旧代码尚未更新。第二个原因是,不幸的是,在线和书籍中有很多糟糕的 C 代码。您可能刚刚找到了一些。

【讨论】:

  • ... 也是在代码高尔夫比赛中节省几个字节的好方法。
  • 哎呀!请不要从阅读代码高尔夫提交中获得任何关于编写代码的想法。 :-)
  • 我正在考虑用 C 制作一些视频教程,所以我决定使用一个更便携的在线编译器,然后我第一次看到这个没有返回类型的 main(我就像' wtf?')
【解决方案2】:

尝试开启警告,GCC 应该会告诉你这通常是被禁止的:

test.c:1:1: warning: return type defaults to ‘int’ [-Wreturn-type]
 main()
 ^

这在旧 C 中曾经有一个定义的含义,其中函数的默认类型是 int。为了不破坏代码,编译器仍然支持它,因为它不是一个大问题,即代码不会突然模棱两可。

【讨论】:

    【解决方案3】:

    如果在 C89 中省略了返回类型,则假定函数返回 int 类型的值。在 C99/11 中,省略函数的返回类型是不合法的。 main的签名定义为:

    C11 5.1.2.2.1 程序启动:

    1 程序启动时调用的函数名为main。实现声明没有 这个函数的原型。它应使用int 的返回类型定义,并且没有 参数:

    int main(void) { /* ... */ }
    

    或带有两个参数(此处称为argcargv,尽管可以是任何名称 使用,因为它们在声明它们的函数中是本地的):

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

    或等价物;10) 或以其他一些实现定义的方式。

    使用-std=c99 标志编译您的代码,您的编译器将针对省略的返回类型发出警告。

    【讨论】:

    • 感谢关于这个-std=c99的提示,我不知道。。曾经有朋友遇到麻烦,因为教授要c99,他们没有使用与教授相同的编译器...
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多