关于C语言include尖括号和双引号的对话
2016-02-19 22:34
281 查看
A: #include "..." 和 #include <...> 有什么区别?
B: 他喵的, 这么简单的问题. 尖括号是先在系统目录下找, 双引号是首先在当前目录下找, 找不到就找系统目录.
A: 说得很含糊. 那么我问你, 当前目录有个叫hdr.h的文件,
当前目录下还有一个子目录sub, sub里面有两个文件hdr.h和1.c,
1.c中#include "hdr.h",
那么在当前目录编译sub/1.c, 它应该包含哪一个hdr.h?
B: 应该包含外面的hdr.h吧, 因为它在gcc工作的当前目录, 而子目录的hdr.h不在当前目录, 应该搜不到.
A: 错, 包含的是sub/hdr.h !
B: 啊!... 喔... 双引号是首先在使用include的源文件所在目录找(也就是1.c所在的目录sub找), 而不是编译器当前工作目录找, 我原来理解错了.
A: 是的, gcc和msvc的include双引号都是先在使用include的源文件所在目录找.
B: C99标准是怎么规定的? 是源文件当前目录还是编译器工作目录?
A: 其实C99标准没有规定#include "..." 先找哪个目录, 只说取决于实现, 你可以设计一个C编译器include双引号时按你设计的方式找(如果找不到退化为#include <...>). 但事实上的工业标准是"双引号优先从使用include的源文件所在目录".
B: 明白了.
A: 那么我再问你, #include <...> 所谓的"从系统目录找", 那么"系统目录"到底有哪些, 怎么看呢?
B: 编译时-I指定的目录呗.
A: 如果没指定-I的参数时, 是不是系统目录列表就是空的?
B: 当然不是, 有默认的吧.
A: 怎么看默认的?
B: 这个不知道. 怎么看?
A: 以gcc为例, 在命令行运行 echo | gcc -E -v -
B: 那么我指定gcc -I. 时是把 . 作为搜索路径还是把当前目录转成绝对路径加入到列表中呢?
A: 这个问题问得好! 其实我也不知道, 要不我们试一下.
B: 并没有转成绝对路径, 就是一个点.
A: 恩, 那么问题来了, 下面这种情形下( 注意: 1.c的内容修改为 #include <hdr.h> ), 会包含那个hdr.h ?
B: 我猜会用子目录的hdr.h.
A: 我猜会用外层的hdr.h,
在hdr.h写个1,
在sub/hdr.h写个2,
然后 gcc -E -I. sub/1.c.
你看结果是1, 我猜对了!
B: 嗯, 看来搜索路径列表是基于编译器工作路径的.
B: 他喵的, 这么简单的问题. 尖括号是先在系统目录下找, 双引号是首先在当前目录下找, 找不到就找系统目录.
A: 说得很含糊. 那么我问你, 当前目录有个叫hdr.h的文件,
当前目录下还有一个子目录sub, sub里面有两个文件hdr.h和1.c,
1.c中#include "hdr.h",
那么在当前目录编译sub/1.c, 它应该包含哪一个hdr.h?
B: 应该包含外面的hdr.h吧, 因为它在gcc工作的当前目录, 而子目录的hdr.h不在当前目录, 应该搜不到.
A: 错, 包含的是sub/hdr.h !
B: 啊!... 喔... 双引号是首先在使用include的源文件所在目录找(也就是1.c所在的目录sub找), 而不是编译器当前工作目录找, 我原来理解错了.
A: 是的, gcc和msvc的include双引号都是先在使用include的源文件所在目录找.
B: C99标准是怎么规定的? 是源文件当前目录还是编译器工作目录?
A: 其实C99标准没有规定#include "..." 先找哪个目录, 只说取决于实现, 你可以设计一个C编译器include双引号时按你设计的方式找(如果找不到退化为#include <...>). 但事实上的工业标准是"双引号优先从使用include的源文件所在目录".
B: 明白了.
A: 那么我再问你, #include <...> 所谓的"从系统目录找", 那么"系统目录"到底有哪些, 怎么看呢?
B: 编译时-I指定的目录呗.
A: 如果没指定-I的参数时, 是不是系统目录列表就是空的?
B: 当然不是, 有默认的吧.
A: 怎么看默认的?
B: 这个不知道. 怎么看?
A: 以gcc为例, 在命令行运行 echo | gcc -E -v -
B: 那么我指定gcc -I. 时是把 . 作为搜索路径还是把当前目录转成绝对路径加入到列表中呢?
A: 这个问题问得好! 其实我也不知道, 要不我们试一下.
B: 并没有转成绝对路径, 就是一个点.
A: 恩, 那么问题来了, 下面这种情形下( 注意: 1.c的内容修改为 #include <hdr.h> ), 会包含那个hdr.h ?
B: 我猜会用子目录的hdr.h.
A: 我猜会用外层的hdr.h,
在hdr.h写个1,
在sub/hdr.h写个2,
然后 gcc -E -I. sub/1.c.
你看结果是1, 我猜对了!
B: 嗯, 看来搜索路径列表是基于编译器工作路径的.
相关文章推荐
- C语言:【动态顺序表】动态顺序表的在指定位置插入元素Insert,以及指定元素Find
- 单件模式
- 74. Search a 2D Matrix
- 【hdu 2896】病毒侵袭 题解&代码(C++)
- C++之 构造函数调用规则
- 【源代码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
- Basic C++ Container classes summary(Array, Vector, List)
- c语言入门之项目2.0——成绩等级
- C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack
- C++基础篇之 复制构造函数调用时机
- c/c++题目汇总一
- C语言之getopt使用
- 【hdu 2222】Keywords Search 中文题意&题解&代码(C++)
- 「Cplusplus」在命令提示符下编译C/C++源文件和运行可执行文件
- 整理摘抄 宏定义笔记
- C++之匿名对象与析构函数的关系
- C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
- [UVA227]Puzzle
- C++数据域封装
- EOF在C++中的定义为:const int EOF = -1;