正确声明ANSI C中的main()函数

C标准说:

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

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

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

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

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

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

 main() { /* taram pampam ... */ return 0; } 

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

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

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

在C99中,情况已不再如此。

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

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

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

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

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

如果定义了它们, main函数的参数应遵循以下约束:

[等等。 …]

在该部分中没有任何内容直接关于这样一个事实,即退出返回类型将导致它默认为int

坦率地说,我很难找到标准指定行为的确切位置。 我最接近的是6.7.1(函数定义),其中函数定义的语法表明’declaration-specifiers’是可选的,示例说:

例子:

  1. 在下面的:

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

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

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

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

 main() 

是一个函数(隐式地)返回int并获取未指定数量的参数

 main(void) 

没有参数。

我公司于1988年印制了K&R版本。当时标准尚未出版,因此存在一些不一致之处。 但是,第2版的大部分都符合C89标准。

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

“程序启动”

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

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

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

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