int main() { printf("Hellon"); return 0; }
我使用下面的命令编译它:
gcc -o myprogram myfile.c
即使我没有#include <stdio.h>也没有任何错误编译。 那么gcc是否自动包含这个头文件呢?
我的gcc版本是4.3.3
在d2i_RSAPrivateKey_fp()中崩溃
如何使Windows上的Clang链接针对不同的运行时间
关于Cygwin的一些问题(套接字,线程,其他编程和shell问题)
C ++链接器如何处理对静态string的引用?
特定Windows用户组的Windows身份validation
如何在Ubuntu上安装Cinder C ++
如何找出用于构build二进制文件的* .c和* .h文件?
Linux上的线程局部variables访问有多快?
为什么DirectX Device Present钩子不能在走弯路上工作?
在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("Hellon"); ^ 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'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。