我知道这是超级基本的,其他一些线程已经讨论过类似的问题。但是我有一本书(C 绝对初学者指南),其中所有代码都写在函数 main() 中。int 总是被排除在外。这怎么可能跑?使用旧版本的 stdio.h 可以吗?
这是示例代码:
#include <stdio.h>
main() // not int main()
{
printf("This is it\n");
return 0;
}
我知道这是超级基本的,其他一些线程已经讨论过类似的问题。但是我有一本书(C 绝对初学者指南),其中所有代码都写在函数 main() 中。int 总是被排除在外。这怎么可能跑?使用旧版本的 stdio.h 可以吗?
这是示例代码:
#include <stdio.h>
main() // not int main()
{
printf("This is it\n");
return 0;
}
我认为 c89 标准将允许main()但 c99 及更高版本不允许。你必须使用int main()否则。
main()
有效但令人困惑,在 C 中 main 函数总是返回一个 int 来指定退出状态,所以正确的语法是int main()
,但如果你不费心设置退出状态就main()
足够了,但是好的 C 书籍总是有int main()
.
这类问题高度依赖标准版本,因此一般答案没有多大意义。
来自 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
在参数列表中添加,没有它的行为定义如上。