正确声明ANSI C中的main()函数
C标准说:
程序启动时调用的函数名为main。 该实现声明此函数没有原型。 它应该使用返回类型int并且没有参数来定义:
int main(void) { /* ... */ }
或者使用两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):
int main(int argc, char *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) { /* ... */ }
或者使用两个参数(这里称为
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
是类型说明符(每个都可以省略,因为它们是默认值)…
是的,在C89(原始C标准)中,如果声明的函数没有返回类型,则假定它返回int
。 C99要求所有函数都有显式返回类型。
此外,main()和main(void)之间存在细微差别(至少在声明中) –
main()
是一个函数(隐式地)返回int并获取未指定数量的参数
main(void)
没有参数。
我公司于1988年印制了K&R版本。当时标准尚未出版,因此存在一些不一致之处。 但是,第2版的大部分都符合C89标准。
我找到了C89标准的文本版本 (YAY for Google); 它说:
“程序启动”
程序启动时调用的函数名为main。 该实现声明此函数没有原型。 它可以不带参数定义:
int main(void) { /*...*/ }
或者使用两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):
int main(int argc, char *argv[]) { /*...*/ }