MinGW编译器不需要函数声明吗?

时间:2012-08-30 00:13:47

标签: c compiler-construction mingw

我有这两个文件:

// first.c
int main(void) {
  putint(3);
}

// second.c
#include <stdio.h>
void putint(int n) {
  printf("%d",n);
  getchar();
}

当我在Win XP下运行gcc 4.6.1时:

gcc first.c second.c -o program.exe

它没有问题,并将3写入stdout。它在 first.c 中不需要putint声明。这怎么可能?这是标准行为吗?

我已经在MSVC 2008 Express上对此进行了测试,并且只能按预期运行声明。

// first.c
void putint(int);
int main(void) {
  putint(3);
}

解决,感谢提示,这些选项有助于显示警告:

  • -Wimplicit
  • -std = c99(MinGW 4.6默认使用gnu90

3 个答案:

答案 0 :(得分:2)

这是C的遗留“功能”,不应该像几十年前那样使用。您应该使用带有设置的编译器,如果您执行此类操作,则会发出警告。 Gcc有几个开关,你应该在使用它时指定。其中一个会给你一个警告。

编辑:我自己没有使用过gcc,但你应该检查的开关是-pedantic,-Wall,-Wextra和-std。

接受这个的编译器假设,根据旧的语言定义,由于你认为不适合告诉它,函数a)返回一个int值和b)因为你传递一个int(或如果你传递了一些可以提升为int的东西,那么函数希望这个参数是一个int。

正如@veer正确指出的那样,这通常适用于您的特定情况。然而,在其他情况下,没有原型的函数的隐含假设与函数的实际签名之间的差异会使事情变得繁荣。

答案 1 :(得分:2)

这不仅适用于MinGW,也适用于所有标准版本的gcc。如上所述,这在C89中是合法的; gcc默认为'gnu89'(不是99),它也接受代码而没有警告。如果切换到c99或gnu99(或更高版本,例如c11),默认情况下会收到警告,但仍会编译。

答案 2 :(得分:0)

正如其他人所指出的,这是C符合编译器的标准行为。命名文件.c部分将其置于C模式。它会有一些有趣的东西,比如“内置函数”(printf()等)和各种遗留的C东西。

我想补充一下我最近经历过的其他人所说的话。 MS明确放弃对C超过C90的支持,至少可以说他们对C90的支持很差。我不完全确定标准的ANSI C90代码库会在较新的VS下编译,因为它基本上是C ++编译器,禁用了大量的东西(而GCC实际上有一个C编译器)。他们这样做是为了推广C ++。如果你想使用真正的C,你不能在MS Visual Studio,任何版本中真正做到这一点,除非你想在函数的开头声明所有的变量等。