C标准说:
程序启动时调用的函数名为main.该实现声明此函数没有原型.它应该使用int的返回类型定义,并且没有参数:
Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):
Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }或等效的或以某种其他实现定义的方式.
但是,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.该实现声明此函数没有原型.它可以不带参数定义:Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为
argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }如果已定义,则
main函数的参数应遵循以下约束:[等等....]
在该部分中没有任何内容直接关于这样一个事实,即退出返回类型将导致它默认为int.
坦率地说,我很难找到标准指定行为的确切位置.我最接近的是6.7.1(函数定义),其中函数定义的语法表明'declaration-specifiers'是可选的,示例说:
例子:
在下面的:
Run Code Online (Sandbox Code Playgroud)extern int max(int a, int b) { return a > b ? a : b; }
extern是存储类说明符,int是类型说明符(每个都可以省略,因为它们是默认值)...