条件编译
有条件编译指令在,编译一个程序的时候,如果要将一条语句(一组语句)编译或者放弃是很方便的
调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译
常见的条件编译指令:
#if 常量表达式
//...
#endif
//常量表达式由预处理器求值
例如:
若常量表达式为假,则将条件编译指令中的语句全部删除
若常量表达式为真,则将条件编译指令中的语句全部保留
相当于
2. 多个分支的条件编译
#if 常量表达式
//...
#elif 常量表达式
//...
#else
//...
#endif
例如:
内部操作与1
中一致
- 判断是否被定义
#if defined(symbol)
//或者(执行的指令相同)#ifdef symbol
#endif
#if !defined(symbol)
//或者(执行的指令相同)#ifndef symbol
#endif
#if defined(symbol)(或者 #ifdef symbol)
表示若define
定义了symbol
,则保留语句#if !defined(symbol)(或者 #ifndef symbol)
表示若define
没有定义symbol
,则保留语句
例如:
- 嵌套指令
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif
文件包含
#include
指令可以使另外一个文件被编译,就像它实际出现于#include
指令的地方一样
替换的方式:
预处理器先删除这条指令,并用包含文件的内容替换
这样一个源文件被包含10次,那就实际被编译10次
头文件被包含的方式
- 本地文件包含
#include "filename"
查找策略:
- 先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件
- 如果找不到就提示编译错误
Linux环境的标准头文件的路径:/usr/include
VS环境的标准头文件的路径:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
----- 这是VS2013的默认路径
按照自己的安装路径去找
- 库文件包含
#include <filename.h>
查找头文件直接去标准路径下去查找,如果找不到就提示编译错误
对于库文件也可以使用
“ ”
的形式包含,但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件
嵌套文件包含
对于这样包含头文件,则头文件test.h
将重复4次,若test.h
头文件内的内容非常大,则会造成许多时间上的浪费
解决问题的方法:
条件编译
后面的名称可以随便称呼(此案例是按照头文件的名字命名)
分析:
当第一次包含头文件test.h
时,会使用#define
定义__TEST_H__
,再次调用头文件test.h
时,会自动放弃
新版机器也支持#pragma once
来解决避免头文件的重复引入