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

在ANSI C中正确声明main()函数,c,kr-c,C,Kr C,C标准规定: 程序启动时调用的函数 它被命名为main。实施 声明没有这方面的原型 功能。应使用一个 返回类型为int,不带 参数: int main(void) { /* ... */ } int main(void) { /* ... */ } int main(void) { /*...*/ } 或具有两个参数(参考 这里是argc和argv,尽管有 可以使用名称,因为它们是本地的 它们所处的功能 声明): 或同等或其他形式 实现定义方式 然而,Kernighan&Ritc

C标准规定:

程序启动时调用的函数 它被命名为main。实施 声明没有这方面的原型 功能。应使用一个 返回类型为int,不带 参数:

int main(void) { /* ... */ }
int main(void) { /* ... */ }
     int main(void) { /*...*/ }
或具有两个参数(参考 这里是argc和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) { /* ... */ }
int main(void) { /* ... */ }
     int main(void) { /*...*/ }
或具有两个参数(此处称为
argc
argv
,但可以使用任何名称,因为它们是声明它们的函数的本地名称):

如果定义了这些参数,则
main
功能的参数应遵守以下约束:

[等等……]

在这一节中,没有直接提到这样一个事实,即取消返回类型将导致它默认为
int

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

示例:

  • 在以下方面:

      extern int max(int a, int b)
      {
          return a > b ? a : b;
      }
    
    extern
    是存储类说明符,
    int
    是类型说明符(每个类型说明符都可以省略,因为它们是默认值)


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

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

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

    main(void)
    

    不带任何论据。

    我的K&R版本是1988年出版的。当时该标准还没有出台,因此存在一些不一致之处。但是,第二版的大部分内容符合C89标准

    我找到了一个(对谷歌来说是的);它说:

    “程序启动”

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

    int main(void) { /* ... */ }
    
    int main(void) { /* ... */ }
    
         int main(void) { /*...*/ }
    
    或具有两个参数(参考 这里是argc和argv,尽管有 可以使用名称,因为它们是本地的 它们所处的功能 声明):


    但是他们的定义在某种程度上没有违反标准吗?没有。如果你在这里暗示一个int,那么它就符合main的可接受定义。扎哈波波夫:他们的定义当时是合法的(和权威的)。C99(后来出现)现在禁止隐式int返回类型。哦,我不知道这里99和89之间的区别,也许这就是原因,因为我引用了99!你有89/90标准吗?你能引用其中关于main的平行段落吗?C89标准说的差不多;但在C89中,没有显式返回类型的函数被隐式假定为返回int,因此无int形式是等效的。@Zaharpoov-我添加了旧标准的详细信息。@JonathanLeffler谢谢。很明显,语言应该像C99一样,将没有显式返回类型的函数视为程序员错误。这么多可怕的决定,由C。。。这里还有一个:这只是在一个声明中——我不知道有谁声明main()。在定义中,这两者是等价的,尽管显式的“intmain(void)”符号通常是更好的C风格;在C++中,省略“空虚”是完全可以接受的。我已经修改了我的文章来反映。虽然它可能不是主要的具体情况,但值得注意的是,其他功能…我认为K&R2是在1988年推出的,不仅仅是你的版本。