您的位置:首页 > 其它

include""和include<>的区别

2015-10-06 09:42 295 查看
转自:http://blog.csdn.net/kobesdu/article/details/38304523

#include “book.h”

#include<iostream.h>

在刚开始学习都会有这种迷惑,有的程序用<>,有的却用"",那么二者到底什么区别呢,什么情况下使用呢?

<>和""表示编译器在搜索头文件时的顺序不同,<>表示从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录,""是表示从当前目录开始搜索,然后是系统目录和PATH环境变量所列出的目录。

所以,系统头文件一般用<>,用户自己定义的则可以使用"",加快搜索速度。

在程序编译之前,首先由预处理器检查程序。在 GCC 工具链中,gcc 和 g++ 分别是C/C++ 编译程序,而预处理程序叫 cpp,是独立的。根据程序中使用的预处理器指令,预处理器使用符号缩略语所代表的内容替换程序中的缩略语。预处理指令以 # 为行首,一条指令占据一行。预处理器不能理解c/c++,它一般可以接收任何文本并按照替换规则将其转换成其他文本。

头文件通过 include 预处理器指示符(preprocessor include directive) 而成为我们程序的一部分。预处理器发现 #include 指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include 指令,
就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。

#include 指令有两种使用形式

#include <stdio.h> 文件名放在尖括号中

#include “mystuff.h” 文件名放在双引号中

尖括号 < 和> 括起来表明这个文件是一个工程或标准头文件。查找过程会检查预定义的目录,我们可以通过设置搜索路径环境变量或命令行选项来修改这些目录。在 gcc 中可以使用 -I 参数修改默认查找路径。

如果文件名用一对引号括起来则表明该文件是用户提供的头文件,查找该

文件时将从当前文件目录(或文件名指定的其他目录)中寻找文件,然后再在标准位置寻找文件。

因为计算机系统的结构不完全相同, 所以ANSI C不要求对文件采用一样的目录模式。一般而言,命名文件的方法依赖于系统,但是尖括号和双引号的使用则与系统无关。

为什么要包含文件呢?

因为这些文件包含了编译器所需的信息,如函数的声明、常量的定义等。例如, 标准库头文件stdio.h文件通常包含EOF,NULL,getchar()和putchar()的定义。

包含大型头文件并不一定显著增加程序的大小。很多情况下,头文件中的内容是编译器产生最终代码所需的信息,而不是加到最终代码里的具体语句。

被包含的文件还可以含有#include 指示符由于嵌套包含文件的原因一个头文件可能会被多次包含在一个源文件中条件指示符可防止这种头文件的重复处理。

例如:

#ifndef BOOKSTORE_H

#define BOOKSTORE_H

/* Bookstore.h 的内容 */

#endif

条件指示符#ifndef 检查BOOKSTORE_H 在前面是否已经被定义,这里BOOKSTORE_H是一个预编译器常量习惯上预编译器常量往往被写成大写字母,如BOOKSTORE_H在前面没有被定义则条件指示符的值为真于是从#ifndef 到#endif 之间的所有语句都被包含进来进行处理。相反,如果#ifndef
指示符的值为假则它与#endif 指示符之间的行将被忽略,为了保证头文件只被处理一次,把如下#define 指示符

#define BOOKSTORE_H

放在#ifndef 后面这样在头文件的内容第一次被处理时BOOKSTORE_H 将被定义

从而防止了在程序文本文件中以后#ifndef 指示符的值为真。

只要不存在两个必须包含的头文件要检查一个同名的预处理器常量这样的情形这

个策略就能够很好地运作。#ifdef 指示符常被用来判断一个预处理器常量是否已被定义以便有条件地包含程序代码。

#ifdef 除了用于防止重复包含,还可以用于针对不同环境的条件编译。经常出现的有

#if defined (__GCC__) || defined (__SUN_C__)

之类的指令,就是针对不同编译器、平台进行选择编译的预处理指令。当编译环境没有定义这个特定的符号的时候,则预处理器会自动忽略这一部分的代码。除了用 #ifdef 判断符号是否定义,还可以判断符号的值。VC 中常见的将 MSC_VER 与特定值比较以判断 VC 的版本的做法就是这个道理。

除了以上提到的一些内容,还有一些相对少见的预处理器指令,如 #pragma。它们分别提供了一些特殊的优化手段和编译器控制方法,可以显著提高代码质量减轻编码负担,但是很多时候使用这些编译指令可能是不兼容于其他编译环境的,因此在项目中选用非标准预处理指令的时候,应该在可移植性和编码的优势中进行衡量后作决定。

Answer 1:

#include 会将指定文件的内容插入到源程序文件中。当使用的格式时,编译器会从环境变量INCLUDE所指定的路径中寻找file-name 文件,如果没有定义INCLUDE,C 编译器会在指定的路径中搜寻文件。如HT-IDE3000安装后,默认INCLUDE路径是c:\ht-ide3000\include.在文件中调用芯片头文件用

#include 如果使用“file-name”的格式,则C
编译器会以指定的方式搜寻file-name 文件,如果没有指定路径,则会从当前所在的路径中找寻文件。一般用户自己定义的头文件要用#include"filename"。如#include "key.h". 如果写成#include ,编译器可能找不到key.h,导致编译出错。

Answer 2:

< >引用的是编译器的类库路径里面的头文件

" "引用的是你程序目录的相对路径中的头文件

假如你编译器定义的自带头文件引用在C:\Keil\c51\INC\下面

则#include引用的就是C:\Keil\c51\INC\stdio.h这个头文件

不管你的项目在什么目录里,C:\Keil\c51\INC\stdio.h这个路径就定下来了

一般是引用自带的一些头文件:stdio.h、conio.h、string.h、stdlib.h等等之类的。。

假如你的项目目录是在D:\Projects\tmp\

则#include "my.h" 引用的就是D:\Projects\tmp\my.h这个头文件

一般是用来引用自己写的一些头文件

如果使用" ",它是会先在你项目的当前目录查找是否有对应头文件

如果没有,它还是会在对应的引用目录里面查找对应的头文件

意思就是,使用#include "stdio.h"如果你项目目录里面,没有stdio.h这个头文件,它还是会定位到C:\Keil\c51\INC\stdio.h这个头文件的。

总结:

面试的时候这样回答就可以了:

< >引用的是编译器的类库路径里面的头文件

" "引用的是你程序目录的相对路径中的头文件,在程序目录的相对路径中找不到该头文件时会继续在类库路径里搜寻该头文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: