我正在学习Simon Long的《学习C语言》。 https://www.raspberrypi.org/magpi-issues/Essentials_C_v1.pdf 在第20页上,有一个简单的程序:
#include <stdio.h>
void main (void)
{
int a = 0;
while (a < 5)
{
printf ("a is equal to %d\n", a);
a++;
}
printf ("a is equal to %d and I've finished\n", a);
}
但是当我编译它时,我得到这个编译器错误:
while-loop.c:3:1: warning: return type of 'main' is not 'int'
[-Wmain-return-type]
void main(void)
^
while-loop.c:3:1: note: change return type to 'int'
void main(void)
^~~~
int
1 warning generated.
这是为什么?看来作者的编译器没有为此提供错误。为什么会有差异?
当我更改
void main (void)
到
int main (void)
它可以编译。
答案 0 :(得分:3)
每5.1.2.2.1 Program startup, paragraph 1 of the C standard(在我的脑海中):
在程序启动时调用的函数称为main。的 实现没有为此函数声明任何原型。 应为 的返回类型为int 且没有参数:
int main(void) { /* ... */ }
或具有两个参数(此处称为argc和argv,尽管有 可以使用名称,因为它们是它们所在的函数的本地名称 声明):
int main(int argc, char *argv[]) { /* ... */ }
或同等学历;或以其他实现定义的方式。
虽然void main()
确实适合“或以其他一些实现定义的方式”,但在我看来,没有特定说明的特定实现特定扩展,例如不属于初学者的扩展只会在以后引起混乱。
至少找到一本书,它不会使眼睛那么疼。