10

C标准说:

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

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

或者带有两个参数(这里称为 argc 和 argv,尽管可以使用任何名称,因为它们是声明它们的函数的局部变量):

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

或等效的或以某种其他实现定义的方式。

然而,Kernighan & Ritchie 在他们的第二版(规范的 ANSI C)圣经中只使用:

main()
{
  /* taram pampam ... */

  return 0;
}

谁是对的?它是否与没有返回值的函数有关,自动假设int在 C 中返回?

4

4 回答 4

16

好吧,如果您想要 ANSI C,那么根据定义,该标准是正确的。

在 C89/C90 中,int返回类型是隐含的,因此 K&R 定义是可以接受的。

在 C99 中,情况不再如此。

C90 标准具有以下措辞(5.1.2.2.1 程序启动),这与 C99 措辞非常相似(可能最重要的是,它使用了不太强的“可以”而不是“应该”):

程序启动时调用的函数名为main. 实现没有声明这个函数的原型。它可以不带参数定义:

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

或带有两个参数(这里称为argcand argv,尽管可以使用任何名称,因为它们对于声明它们的函数是本地的):

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

如果已定义,则main函数的参数应遵守以下约束:

[ETC。...]

该部分没有直接说明放弃返回类型将导致它默认为int.

坦率地说,我很难找到标准规定的行为的确切位置。我能来的最接近的是 6.7.1(函数定义),其中函数定义的语法表明“声明说明符”是可选的,示例说:

例子:

  1. 在下面的:

      extern int max(int a, int b)
      {
          return a > b ? a : b;
      }
    

    extern是存储类说明符并且int是类型说明符(每个都可以省略,因为它们是默认值)...

于 2009-11-19T18:56:22.367 回答
4

是的,在 C89(原始 C 标准)中,如果函数声明时没有返回类型,则假定它为 return int。C99 要求所有函数都有明确的返回类型。

于 2009-11-19T18:56:30.230 回答
3

此外,main() 和 main(void) 之间存在细微差别(至少在声明中)——

main()

是一个函数(隐式)返回 int 并采用未指定数量的参数

main(void)

不接受任何论据。

于 2009-11-19T19:06:24.293 回答
0

我拥有的 K&R 版本是 1988 年印刷的。那时标准还没有出来,所以有一些不一致之处。但是,第 2 版的大部分内容都符合 C89 标准。

我找到了C89 标准的文本版本(谷歌的 YAY);它说:

“程序启动”

程序启动时调用的函数名为 main 。实现没有声明这个函数的原型。它可以不带参数定义:

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

或带有两个参数(此处称为 argc 和 argv ,尽管可以使用任何名称,因为它们是声明它们的函数的局部变量):

     int main(int argc, char *argv[]) { /*...*/ }
于 2009-11-19T19:14:52.627 回答