gcc会自动包含一些头文件吗?

时间:2016-06-14 21:53:32

标签: c linux gcc

我有以下代码:

int main()
{
    printf("Hello\n");
    return 0;
}

我使用以下命令编译它:

gcc -o myprogram myfile.c

即使我没有#include <stdio.h>,它也没有任何错误编译。那么gcc会自动包含这个头文件吗?

我的gcc版本是4.3.3

2 个答案:

答案 0 :(得分:3)

在ANSI C中,您可以调用您没有声明的函数。这些函数在您第一次调用时隐式声明。假定它们返回int并根据默认参数提升获取参数。由于您没有包含<stdio.h>,编译器使用此规则并隐式声明{ {1}}。请注意,这是未定义的行为,因为必须明确声明采用printf等变量参数列表的函数。 gcc通常会警告你,如果它使用隐式声明规则,因为它通常不是故意使用的。

答案 1 :(得分:1)

不,gcc没有包含您没有要求的任何头文件。 #include语句是在实际C编译之前实际评估的C预处理器宏(如#define#if)。通过调用gcc -E myfile.c解决所有宏后,您可以看到代码的样子。如您所见,printf仍未被声明。

如果您使用-Wall进行编译,则应收到printf未声明的警告。然而,gcc&#34;猜测&#34;如何使用printf(可能来自它的参数,但它也可以简单地在内部知道例程)。由于它在链接时找到匹配的符号名称,因此您不会收到错误,并且您的程序运行正常。

BTW,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'