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

zah*_*pov 9 c kr-c

C标准说:

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

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

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

int main(int argc, char *argv[]) { /*
... */ }
Run Code Online (Sandbox Code Playgroud)

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

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

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*urr 14

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

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

在C99中不再是这种情况.

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

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

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

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

int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

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

[等等....]

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

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

例子:

  1. 在下面的:

      extern int max(int a, int b)
      {
          return a > b ? a : b;
      }
    
    Run Code Online (Sandbox Code Playgroud)

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