文章目录
- 前言
- 一、命令行定义
- 二、条件编译
- 三、文件包含
- 头文件被包含的方式
- 嵌套文件包含
- 总结
前言
再介绍几点吧!
一、命令行定义
许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程
当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候,这个特性便起到了作用。(假定某个程序中声明了一个某长度的数组,但是一个机器的内存有限,我们需要一个很小的数组,但是另外一个机器的内存很大,我们需要一个较大的数组)
以下代码就是一个具体的例子:
二、条件编译
条件编译,即满足条件就参与编译,不满足条件就不参与编译
未满足条件编译指令的代码,在预处理阶段将被编译器自动删除,不参与后面的代码编译过程
常见的条件翻译指令有以下几种:
- 单分支的条件编译
//如果#if后面的表达式为真,则“待定代码”的内容将参与编译
//否则“待定代码”的内容不参与编译
#if 表达式
//待定代码
#endif
- 多分支的条件编译
//多分支的条件编译类似于if-else语句
//“待定代码1,2,3,4”之中只会有一段代码参与编译
#if 表达式
//待定代码1
#elif 表达式
//待定代码2
#elif 表达式
//待定代码3
#else 表达式
//待定代码4
#endif
- 判断是否被定义
//如果“表达式”被#define定义过,则“第一种的正面”的“待定代码”将参与编译,否则不参与编译。
//“第一种的反面”的执行机制与“第一种的正面”恰好相反
//第一种的正面
#if defined(表达式)
//待定代码
#endif
//第一种的反面
#if !defined(表达式)
//待定代码
#endif
- 嵌套指令
#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 "filename"
此时查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。如果找不到就提示编译错误
假如你包含了以下头文件:
#include <filename>
此时查找策略:查找头文件直接去标准路径下去查找,如果找不到就提示编译错误
所以说,对于库函数也可以使用 “ ” 的包含方式,只不过效率不高
嵌套文件包含
最终test.c程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复
解决办法有两种:
- 使用条件编译,如果定义过,则无法再进行编译
#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif
- 加上该语句:
#pragma once
总结
终于结束了,马上就要迎来最后一篇收尾
事先预告,虽然是最后一篇,但是并不是那么简单!