同一程序在一个编译器中而不是其他编译器中给出编译器错误

时间:2019-04-29 16:18:43

标签: c

我正在学习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)

它可以编译。

1 个答案:

答案 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()确实适合“或以其他一些实现定义的方式”,但在我看来,没有特定说明的特定实现特定扩展,例如不属于初学者的扩展只会在以后引起混乱。

至少找到一本书,它不会使眼睛那么疼。