37.0、C语言——C语言预处理(5) - 文件包含
文件包含
1. 我们已经知道 ,#include 指令可以使另外一个文件被编译;就像他实际出现于 #include 指令的地方一样;
2. 这种替换的方式很简单:预处理器先删除这条指令,并用包含文件的内容替换;这样一个源文件被包含 10 次,那就实际被编译 10 次;
头文件被包含的方式:
1. 本地文件包含 ->
#include "filename"
查找策略,先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件;如果找不到就提示编译错误;linux 环境的标准头文件的路径;
VS环境标准头文件路径:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include
2. 库文件包含 ->
#include <filename.h>
查找头文件直接去标准路径下查找,如果找不到就提示编译错误;
1. 这样是不是可以说,对于库文件也可以使用 " " 的形式包含吗? 答案是肯定的,可以
2. 但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了;
3. 在预编译阶段 - 文件包含其实就是将被包含的文件内容拷贝一份,然后放到 #include 的文件中;
头文件的重复引入——解决方案
如果头文件重复的引入,会导致头文件的内容拷贝多次并且放到 #include 的文件中,造成代码冗余;
那其实这个问题在开发中是不可避免的,因为假设 程序猿A、程序猿B、程序猿C 分工合作写一个项目,那么在最后项目程序对接的时候,三个人的代码肯定会合到一起,那么很容易出现头文件重复引入的问题发生;
那怎么解决这个问题呢?
我们可以用 条件编译 去解决这个问题 ->
#ifndef __TEST_H__ #define __TEST_H__ int Add(int x, int y); #endif
解释一下:#ifndef 判断如果 __TEST_H__ 未定义,则定义一个 __TEST_H__ 然后将int Add(int x ,int y);拷贝一份放到 #include 的文件中去;
当我们第二次重复引入该头文件的时候,依旧是#ifndef 判断 -> 由于前面引入过一次该头文件,所以 __TEST_H__ 已经定义过了,那么下面至 #endif 的代码全部失效 -> 不参与编译,这样就不会重复拷贝相同的代码了;
这样问题就解决了~
那么再给大家介绍一种解决头文件重复引入的方法 ->
#pragma once int Add(int x, int y);
这是一种比较新的写法,更为简单一下,也能够和上面第一种方法一样达到同样的效果;【只不过 这种写法在一些比较老的编译器中可能编不过去】