在ANSI C中正确声明main()函数
C标准规定: 程序启动时调用的函数 它被命名为main。实施 声明没有这方面的原型 功能。应使用一个 返回类型为int,不带 参数:在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
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年推出的,不仅仅是你的版本。