我有以下代码:
int main()
{
printf("Hello\n");
return 0;
}
我使用以下命令编译它:
gcc -o myprogram myfile.c
即使我没有#include <stdio.h>
,它也没有任何错误编译。那么gcc会自动包含这个头文件吗?
我的gcc版本是4.3.3
答案 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'