5

可能重复:
c 中 main(void) 和 main() 之间的区别

我知道这是超级基本的,其他一些线程已经讨论过类似的问题。但是我有一本书(C 绝对初学者指南),其中所有代码都写在函数 main() 中。int 总是被排除在外。这怎么可能跑?使用旧版本的 stdio.h 可以吗?
这是示例代码:

#include <stdio.h>

main()  // not int main()
{
printf("This is it\n");
return 0;
}
4

3 回答 3

4

我认为 c89 标准将允许main()但 c99 及更高版本不允许。你必须使用int main()否则。

于 2012-11-24T17:15:15.493 回答
1

main()有效但令人困惑,在 C 中 main 函数总是返回一个 int 来指定退出状态,所以正确的语法是int main(),但如果你不费心设置退出状态就main()足够了,但是好的 C 书籍总是有int main().

于 2012-11-24T17:10:13.517 回答
1

这类问题高度依赖标准版本,因此一般答案没有多大意义。

来自 C89 草案(如果官方 C89 标准不同,请纠正我,它不是免费提供的):

程序启动时调用的函数名为 main。实现没有声明这个函数的原型。它可以不带参数定义:

int main(void) { /*...*/ }

或者带有两个参数(这里称为 argc 和 argv,尽管可以使用任何名称,因为它们是声明它们的函数的局部变量):

int main(int argc, char *argv[]) { /*...*/ }

C99 和 C11 标准的说法相同,但它们在 and 处添加了一些内容:

[...]

或等效的;[9] 或以其他一些实现定义的方式。

[9] 因此,int 可以替换为定义为 int 的 typedef 名称,或者 argv 的类型可以写为 char ** argv,依此类推。

一般来说,标准中未定义的事物会导致未定义的行为,因此该代码在 C89/C90 中是 UB,它在 C99 和 C11 中可能有效,但这是实现定义的。

PS:如您所见,您还应该void在参数列表中添加,没有它的行为定义如上。

于 2012-11-24T17:35:55.397 回答