C标准说:
程序启动时调用的函数 被命名为主要。实施 声明没有原型 功能。它应定义为 返回int类型和没有 参数:
int main(void) { /* ... */ }
或有两个参数(参考 这里作为argc和argv,尽管如此 可以使用名称,因为它们是本地的 它们所处的功能 声明):
int main(int argc, char *argv[]) { /* ... */ }
或同等或其他 实现定义的方式。
然而,Kernighan& Ritchie在他们的第二版(规范的ANSI C)圣经中使用:
main()
{
/* taram pampam ... */
return 0;
}
谁是对的?
它是否与函数没有返回值自动假设在C中返回int
?
答案 0 :(得分:14)
好吧,如果你想要ANSI C,那么根据定义,标准是正确的。
在C89 / C90中隐含了int
返回类型,因此K& R定义是可以接受的。
在C99中不再是这种情况。
C90标准具有以下措辞(5.1.2.2.1程序启动),这与C99措辞非常相似(可能最重要的是它使用不太强的'can'而不是'shall'):
程序启动时调用的函数名为
main
。该实现声明此函数没有原型。它可以不带参数定义:int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可以使用任何名称,因为它们是声明它们的函数的本地名称):int main(int argc, char *argv[]) { /* ... */ }
如果定义了它们,
main
函数的参数应遵守以下约束条件:[等等。 ...]
在该部分中没有任何内容直接说明,退出返回类型会导致其默认为int
。
坦率地说,我很难找到标准指定行为的确切位置。我最接近的是6.7.1(函数定义),其中函数定义的语法表明'declaration-specifiers'是可选的,例子说:
示例:
- 醇>
以下内容:
extern int max(int a, int b) { return a > b ? a : b; }
extern
是存储类说明符,int
是类型说明符(每个都可以省略,因为它们是默认值)...
答案 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[]) { /*...*/ }