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尖括号和双引号的对话相关推荐

  1. c语言尖括号 注释,关于C语言include尖括号和双引号的对话

    A: #include "..." 和 #include <...> 有什么区别? B: 他喵的, 这么简单的问题. 尖括号是先在系统目录下找, 双引号是首先在当前目录 ...

  2. 尖括号和双引号的区别

    尖括号<>和双引号""的区别: 加双引号表示,应用程序先在当前的文件夹里面寻找该头文件,若没有找到,再到系统文件夹里去找. 一般加双引号多为自己编写的头文件,自己编写的 ...

  3. c语言#include后的尖括号和双引号有什么区别?

    1.使用尖括号的话,编译时会先在系统include目录里搜索,如果找不到才会在源代码所 在目录搜索. 2.使用双引号则相反,会先在源代码目录里搜索,如果未找到则去系统默认目录查找,通 常用于包含程序作 ...

  4. C语言中文件包含#include使用尖括号和双引号的区别

    用尖括号 #include <>: 一般用于包含标准的库头文件,编译器会去系统配置的库环境变量和者用户配置的路径去搜索,而不会在项目的当前目录去查找 用双引号 #include " ...

  5. C语言头文件尖括号和双引号的区别

    范围不同导致预编译处理的速度不同 双引号是最大范围 一般用于包含用户自己编写的头文件 编译器会先在项目的当前目录查找 找不到后才会向尖括号那样 去系统配置的库环境变量和用户配置的路径去搜索 初学的同学 ...

  6. C++包含头文件时尖括号和双引号区别

    原文链接:http://c.biancheng.net/cpp/biancheng/view/66.html 如果你还看一些别的C++教程,那么你可能很早就发现了,有些书上的#include命令写作# ...

  7. 尖括号与双引号所引起的错误

    在包括一个文件时,如果用的是尖括号〈,那么包含的将是(编译)系统的文件,如果用的是双引号 ",那么包含的将是当前路径下的文件,二者是不同的 例如在VC6.0中,编译系统本身带有 AFXMSG ...

  8. c语言中尖括号的作用,C语言中,#include

    C语言中,#include 头文件中的尖括号可以用双引号""代替吗?那还可以用圆括号代替呢?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后 ...

  9. xss绕过尖括号和双括号_xss挑战平台练习

    -------------------------XSS挑战之旅------------------------- 最近在学习xss,找到了一个xss练习平台,在线地址:http://test.xss ...

最新文章

  1. oracle11g 多了个 client,Oracle10g Client Oracle11g DB同时安装发生OCI Error
  2. mysql单列索引和多列索引_浅谈MySQL索引优化
  3. 如何在Java代码中使用SAP云平台CloudFoundry环境的环境变量
  4. 检查用户是否有访问权限
  5. Android常用对话框
  6. 计算机专业哪个专业不需要数学,计算机软件专业是不是需要数学很好啊
  7. 微信公众号运营工具汇总
  8. iOS音乐播放器(歌词自动滚动)
  9. 广义相对论 的 一个问题
  10. 半监督学习之伪标签(pseudo label,entropy minimization,self-training)
  11. 人脸识别签到实习第三天
  12. java中不等于空怎么写_JAVA判断不等于空的情况
  13. php请求纯文本,php – 使用纯文本回退发送HTML简报
  14. usb声卡驱动(六):usb声卡中的pcm打开和关闭
  15. android uri图片压缩,详解android 通过uri获取bitmap图片并压缩
  16. 一步步蚕食的意思_第800章 一步步蚕食
  17. Tiny4412汇编流水灯代码,Tiny4412裸机LED操作[1]
  18. fib函数用python编写求第n项_深市收盘价如何确定
  19. 什么是版权,怎么申请
  20. jQuery 混淆加密无法反编译的分享

热门文章

  1. java数据库实例_选择数据库实例
  2. Centos7 -bash: ifconfig : command not found
  3. Java 面试之数据结构
  4. android 底部黑边,android – 截屏周围的黑色边缘
  5. android studio table居中代码_html table表格标签内容如何居中显示?表格的align属性的用法介绍...
  6. NLOPT ros下的使用
  7. 知识图谱运用于推荐系统
  8. tomcat清除缓存配置方法
  9. 从零开始学 Web 之 ES6(三)ES6基础语法一
  10. 设计模式C++实现_2_简单工厂模式