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

时间:2009-11-19 18:54:37

标签: c kr-c

C标准说:

  

程序启动时调用的函数   被命名为主要。实施   声明没有原型   功能。它应定义为   返回int类型和没有   参数:

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

或有两个参数(参考   这里作为argc和argv,尽管如此   可以使用名称,因为它们是本地的   它们所处的功能   声明):

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

或同等或其他   实现定义的方式。

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

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

  return 0;
}

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

4 个答案:

答案 0 :(得分:14)

好吧,如果你想要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是类型说明符(每个都可以省略,因为它们是默认值)...

  2.   

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

main()

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

main(void)

no 参数。

答案 3 :(得分:0)

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

我找到了text version of the C89 Standard(谷歌的YAY);它说:

  

“程序启动”

     

在程序中调用的函数   startup被命名为main。该   实现声明没有原型   这个功能。它可以定义   没有参数:

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

或有两个参数(参考   这里作为argc和argv,尽管如此   可以使用名称,因为它们是本地的   它们所处的功能   声明):

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