#include包含头文件之尖括号与双引号详解

来源:互联网 发布:王者荣耀优化 编辑:程序博客网 时间:2024/06/07 19:47

不废话,先上结论

#include "" : 首先在所有被编译的.c所在的路径中,查找头文件,如果找不到,则到 -I路径下去找头文件

#inclue <> :首先在-I路径下去找,如果找不到,那就找不到了,编译错误


目的:搞清楚#include <>与 #include “”包含头文件的顺序

输入:

目录结构:如图所示,我在dlmu.c的同级目录下增加了dlmu.h,log路径下增加了dlmu.h,build路径下增加了dlmu.h,不同的头文件中,对宏INCLUDE_TEST的定义不同,通过打印宏的值,来判断先包含哪些路径下的头文件


1、当用双引号时的代码:


#include <unistd.h>#include <syslog.h>#include <log.h>#include <execinfo.h>#include <stdio.h>#include "dlmu.h"#undef LOG_MODULE_NAME#define LOG_MODULE_NAME "DLMU"#define DELAY_TIME 600#ifndef INCLUDE_TEST#define INCLUDE_TEST "No include macro"#endifint main(int argc, char **argv){printf("%s\n", INCLUDE_TEST);return 0;}

用双引号时的打印结果:

[root@FriendlyARM caijinqiu]# ./dlmu                                            
/home/caijinqiu/SVN/src/networking/common/dlmu.h                                

可以看出,用双引号的时候先搜索.c文件所在的路径

2、删除dlmu.c所在路径的头文件,查看结果

[root@FriendlyARM caijinqiu]# ./dlmu                                            
/home/caijinqiu/SVN/src/networking/log/dlmu.h

可以看出,当前路径下没有头文件的时候,回去工程内其它路径下搜索

3、删除log路径下的的头文件,查看结果

/home/caijinqiu/SVN/src/networking/project/build/../release
rm -rf /home/caijinqiu/SVN/src/networking/project/build/../release/* -v
已删除"/home/caijinqiu/SVN/src/networking/project/build/../release/dlmu"
/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc -g -Wall -I/usr/local/arm/4.3.2/lib/gcc/arm-none-linux-gnueabi/4.3.2/include -I/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include -I../../log ../../common/dlmu.c ../../log/log.c -o /home/caijinqiu/SVN/src/networking/project/build/../release/dlmu
../../common/dlmu.c:21:18: error: dlmu.h: No such file or directory
make: *** [/home/caijinqiu/SVN/src/networking/project/build/../release/dlmu] 错误 1

编译出错,猜测,用双引号#include的时候,只会在同一级路径,或者下一级路径下搜索,在remote_call路径下添加头文件,commn路径下新建文件夹,增加头文件,然后再进行测试

4、按照上面的假设,发现还是编译错误,查看原因,发现没有编译remote_call.c,所以猜测#include""会在所有被编译的.c所在的路径搜索头文件

/home/caijinqiu/SVN/src/networking/project/build/../release
rm -rf /home/caijinqiu/SVN/src/networking/project/build/../release/* -v
/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc -g -Wall -I/usr/local/arm/4.3.2/lib/gcc/arm-none-linux-gnueabi/4.3.2/include -I/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include -I../../log ../../common/dlmu.c ../../log/log.c -o /home/caijinqiu/SVN/src/networking/project/build/../release/dlmu
../../common/dlmu.c:21:18: error: dlmu.h: No such file or directory
make: *** [/home/caijinqiu/SVN/src/networking/project/build/../release/dlmu] 错误 1

5、在编译脚本的-I路径下增加头文件,并且用#include "",看能否找到头文件

[root@FriendlyARM caijinqiu]# ./dlmu                                            
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/dlmu.h 

发现可以找到头文件,证明,在本地找不到头文件,会到-I路径下去找头文件

6、在common文件夹下增加dlmu.h,并用#include ""

[root@FriendlyARM caijinqiu]# ./dlmu                                            
/home/caijinqiu/SVN/src/networking/common/dlmu.h 

发现,首先在本地找头文件

7、在上一次的情况下,用#include <>

[root@FriendlyARM caijinqiu]# ./dlmu                                            
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/dlmu.h             

证明,先在 -I路径下查找

8、在上一次的情况下,删除系统路径下的头文件,看是否会去本地路径里找

/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc -g -Wall -I/usr/local/arm/4.3.2/lib/gcc/arm-none-linux-gnueabi/4.3.2/include -I/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include -I../../log ../../common/dlmu.c ../../log/log.c -o /home/caijinqiu/SVN/src/networking/project/build/../release/dlmu
../../common/dlmu.c:21:18: error: dlmu.h: No such file or directory
make: *** [/home/caijinqiu/SVN/src/networking/project/build/../release/dlmu] 错误 1

发现不会到本地路径里去找












0 0