关于C语言include尖括号和双引号的对话
来源:互联网 发布:淘宝联盟怎么推广赚钱 编辑:程序博客网 时间:2024/05/18 01:01
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: 嗯, 看来搜索路径列表是基于编译器工作路径的.
- 关于C语言include尖括号和双引号的对话
- C语言include中双引号和尖括号的区别
- C语言中文件包含#include使用尖括号和双引号的区别
- c语言#include后的尖括号和双引号有什么区别?
- #include 尖括号 和 双引号 的区别
- include中双引号和尖括号的区别
- #include后尖括号和双引号的区别
- C++ include 双引号和尖括号的区别
- include的双引号与尖括号
- C++ #include—尖括号和双引号的区别
- C++ #include—尖括号和双引号的区别
- C++ #include—尖括号和双引号的区别
- c语言在包含头文件时用尖括号和双引号的区别
- C语言——头文件中尖括号和双引号的区别
- include包含头文件的语句中,双引号和尖括号的区别是什么?
- include包含头文件的语句中,双引号和尖括号的区别
- include包含头文件的语句中,双引号和尖括号的区别
- #include指定文件的两种方式:尖括号(< >)和双引号(" ")区别
- Light OJ 1421 Wavio Sequence (简单DP)
- MFC基础,MFC自绘控件学习总结.
- 【POJ】[2387]Til the Cows Come Home
- VM12即VMware Workstation 12 序列号
- 数据离散化
- 关于C语言include尖括号和双引号的对话
- 栈
- 1.1.3:可视化的累加器
- java高性能 tcp协议代码示例(一)
- android 音乐播放bug
- ACM_普通DP
- HDU 5172 GTY's gay friends
- 三思而行 --jsp基础篇
- 最近关于evaluation model的进阶理解(待更新)