MinGW的编译器并不需要的函数声明?(MinGW compiler doesn't nee

2019-10-28 16:39发布

我有这两个文件:

// 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。 它不需要putintfirst.c声明。 这怎么可能? 这是标准的行为吗?

我已经在MSVC 2008 Express的测试,这一点,并预期它的声明只运行。

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

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

  • -Wimplicit
  • -std = C99(4.6 MinGW的仍然使用gnu90默认情况下)

Answer 1:

这是C不应前使用几十年遗留下来的“功能”。 您应该使用编译器的设置,如果你做这样的事情,我们会警告你。 GCC有几个开关使用它与其中一人会给你这样的警告时,您应该指定。

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

即接受该编译器是假设,按照旧的语言定义,因为你没有看到适合否则告诉它的功能)返回一个int值和b)因为你传递一个int(或者,如果通过这东西可以被提升到一个int)函数需要这样的说法是一个int。

作为@veer正确地指出,这通常应该在特定的情况下工作。 在其他情况下,但是,如果没有原型和功能的实际签名功能的隐含假设之间的差异会使得事情热潮。



Answer 2:

这不仅是对MinGW的,但所有标准版本的gcc。 如上所述,这是C89的法律; GCC默认为“gnu89”(未99),其还接受代码没有警告。 如果切换到C99或gnu99(或更高版本,如C11),你会得到默认的警告,但它仍然会编译。



Answer 3:

正如其他人所指出的,这是C遵循编译器标准的行为。 命名文件的.c部分把它放在C模式。 它会很开心的事情,如“内置函数”(printf()函数等)和各种传统的C东西。

我想加入到别人怎么说,我最近经历,虽然。 MS明确下降的支持对C过去C90和C90的支持很差,至少可以说。 我不能完全确定标准ANSI C90代码库将根据新的VS的编译,因为它基本上是C ++编译器,有很多东西被禁用(而GCC实际上有一个C编译器)。 他们为了促进C ++这样做。 如果你想使用真正的C,你不能真正做到在MS Visual Studio中,任何版本,除非你想在功能等开始被宣布所有的变量



文章来源: MinGW compiler doesn't need function declarations?