我有以下代码:
int main() { printf("Hello\n"); return 0; }
我使用下面的命令编译它:
gcc -o myprogram myfile.c
即使我没有#include <stdio.h>
也没有任何错误编译。 那么gcc是否自动包含这个头文件呢?
我的gcc版本是4.3.3
在ANSI C中,你可以调用你没有声明的函数。 这样的功能是在您第一次给他们打电话时隐含声明的。 他们被假定返回int
并根据默认的参数促销参数。 由于您没有包含<stdio.h>
,因此编译器使用此规则并隐式声明printf
。 请注意,这是未定义的行为,因为需要显式声明像printf
这样的可变参数列表的printf
。 gcc通常会警告你是否使用隐式声明规则,因为它通常不是有意使用的。
不,gcc没有包含任何你没有请求的头文件。 #include
语句是C预处理器宏(如#define
或#if
),它们在实际的C编译之前实际进行了评估。 通过调用gcc -E myfile.c
解决所有的宏之后,你可以看到你的代码是什么样的。 如你所见, printf
仍然不会被声明。
如果使用-Wall
编译,则应该得到printf
未声明的警告。 然而,gcc“猜测” printf
是如何使用的(可能来自它的参数,但它也可以简单地知道内部的例程)。 由于它在链接时找到匹配的符号名称,所以不会出现错误,并且程序运行得很好。
顺便说一下,gcc 5.3.0显示以下警告:
myfile.c: In function 'main': myfile.c:3:5: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration] printf("Hello\n"); ^ myfile.c:3:5: warning: incompatible implicit declaration of built-in function 'printf' myfile.c:3:5: note: include '<stdio.h>' or provide a declaration of 'printf'