C编译器在未指定类型时不抛出错误

use*_*797 5 c gcc implicit-int

为什么以下程序不会抛出错误:

dfljshfksdhfl;
#include <stdio.h>
int main () {
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc 只会发出警告:

test.c:1:1:警告:数据定义没有类型或存储类[默认启用]

Sha*_*our 7

这是因为即使隐式int不再是C标准的一部分,因为C99一些编译器仍然支持它,主要是为了防止破坏很多旧代码.所以这一行:

dfljshfksdhfl;
Run Code Online (Sandbox Code Playgroud)

最终相当于:

int dfljshfksdhfl;
Run Code Online (Sandbox Code Playgroud)

clang 默认情况下为我们提供了更多信息警告:

warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
dfljshfksdhfl;
^~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我们可以使用-pedantic-errors标志将其变成一个错误,虽然奇怪的是这不起作用clang,所以我们不得不诉诸-Werror并将所有警告变成错误,这实际上是一个很好的习惯.正如remyabel指出的那样,clang我们也可以使用-Werror=implicit-int.