我有这两个文件:
// first.c
int main(void) {
putint(3);
}
和
// second.c
#include <stdio.h>
void putint(int n) {
printf("%d",n);
getchar();
}
当我在WinXP:下运行gcc 4.6.1时
gcc first.c second.c -o program.exe
它没有问题,并将3写入stdout。它不需要先在中声明putint
。c。这怎么可能?这是标准行为吗?
我已经在MSVC 2008 Express上测试过了,它只按照预期的声明运行。
// first.c
void putint(int);
int main(void) {
putint(3);
}
已解决,感谢提示,这些选项有助于显示警告:
- -Wimplicit
- -std=c99(默认情况下,MinGW 4.6仍然使用gnu90)
这是C的遗留"功能",几十年前就不应该使用了。如果你做了这样的事情,你应该使用一个带有设置的编译器来警告你。Gcc有几个开关,您应该在使用它时指定&其中一个会就此向你发出警告。
编辑:我自己还没有使用gcc,但您应该检查的开关是-pedantic、-Wall、-Wextra和-std。
根据旧的语言定义,接受这一点的编译器假设,由于你认为不适合告诉它其他情况,函数a)返回一个int值,b)由于你传递了一个int(或者如果你传递了一些可以提升为int的东西),函数期望该参数是一个int。
正如@veer正确指出的那样,这通常适用于您的特定情况。然而,在其他情况下,没有原型的函数的隐含假设与函数的实际签名之间的差异会使事情变得繁荣。
这不仅适用于MinGW,而且适用于所有标准版本的gcc。如前所述,这在C89中是合法的;gcc默认为"gnu89"(而不是99),它也会在没有警告的情况下接受代码。如果切换到c99或gnu99(或更高版本,如c11),默认情况下会收到警告,但它仍然会编译。
正如其他人所指出的,这是符合C的编译器的标准行为。将文件命名为.c会使其部分处于c模式。它会有一些有趣的东西,比如"内置函数"(printf()等)和各种遗留的C。
不过,我想补充一下其他人所说的我最近的经历。微软明确表示在C90之后放弃了对C的支持,至少可以说他们对C90的支持很差。我不完全确定标准ANSI C90代码库是否会在较新的VS下编译,因为它基本上是禁用了很多东西的C++编译器(而GCC实际上有一个C编译器)。他们这样做是为了推广C++。如果你想使用真正的C,你不能在任何版本的MSVisualStudio中真正做到这一点,除非你想在函数等的开头声明所有变量。