the difference between #include"xx.h" and #include<xx.h>
#include" .h"是用来引入非标准库的头文件的,编译器从用户的工作目录开始搜索
这个过程是这样的:其中“ ” 表示编译器先从程序源文件所在的目录中查找,如果没有找到的话,再去系统默认的目录去找,通常是用来包含程序编写者提供的头文件(“ ” 表示首先在当前的源文件目录中去查找,如果找不到的话,才去包含目录去找)
#include <>格式:引用标准库头文件,编译器从标准库目录开始搜索
简单来叙述一下这个过程:<>表示的是只是在系统默认的目录或者是括号内的路径进行查找,用于来包含系统自带的头文件(<> 表达的意思是在包含文件目录中去找,不会在源文件目录去找)
通过上面的描述以后,我们可以感觉到 “ ”引入头文件的方式是要比 <>引入头文件搜索的范围更加的大
在这里可以简答一下# include 的作用其实就是寻找后面跟的那个并且将文件的内容拷贝一份到当前的文件里面来,被包含文件里面的内容会替换源代码文件里的#include指令
“好人做到底,送佛送到西",既然我们说到了这里的话呢,顺便说一下头文件防止被引入多次的问题,相信很多的读者在初学编程的时候都会遇见这样的问题
首先提出一个问题:为什么要防止头文件的多次引入???
我们初学者平时在编写代码的时候,一般头文件的个数都在几个左右,不会很多,所以对于这个问题的感触不是很深。
但是通过举出一个很简单的例子你就明白为什么要防止头文件的多次引入了
接下来继续讲一下这样做的后果是什么??
因为我们在App.h里面定义了一个变量a,那么相应的在Test.h里面我们也会有int a = 10,因为我在上面提到了,#include的一个作用就是将后面文件的内容拷贝一份到当前的文件里面,所以也可以理解为什么我这样说了,你想想,当我在.c文件里引入这两个头文件的时候,会出现什么样子的情况啊,是不是会出现两次int a = 10,但是我们知道这样肯定是不可以的,俗话说的好,一山不容二虎,有两个一样的变量a,这样是不允许的,所以肯定会出错的。
那么出错了如何去解决呢,我们这里给出两种方法:
两种方式的比较:
#ifndef 的方式依赖于宏名不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含(谁先被引入谁有用)。当然,缺点就是如果不同头文件的宏名不小心相同时,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况(内容虽然不一样,但是宏名一样的话,编译器也是不允许的)。
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名相同引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,此时就不能保证他们不被重复包含。当然,相比宏名相同引发的“找不到声明”的问题,重复包含更容易被发现并正。
最后补充一下:
方式一可以避免名字冲突,方式二 由语言支持所以移植性好
我的下一篇博客是讲解