C++---基础篇(预处理程序指令)

来源:互联网 发布:三角铁知乎 编辑:程序博客网 时间:2024/05/02 20:21

常见的预处理命令有:

文件包含命令;

条件编译命令;

宏定义命令。

文件包含命令

#include<文件名>  include 是关键字,以“#”开始表示其时一个预处理命令。文件名是被包含的文件全名;使用这种格式,是包含那些由系统提供的并存放在指定子目录中的头文件,如iostream.h,math.h

#include<文件名>是包含那些用户自定义的放在当前目录或者其他目录下的头文件和源代码文件

 

宏定义:

用宏定义命令来定义一个标识符用来替换文件中特定的字符串,格式为:#define 宏名 字符串 如:#define PI 3.14.15926

宏定义和const常量定义非常相似,但是也有区别,区别是:

1、const定义的是一个有数据类型的常量,而宏定义无数据类型,可以替换程序代码中的任何字符常量;

2、const定义的常量是有内存分配的,并保存在内存中,而宏定义是没有内存分配的;

3、const定义常量是一个语句,以“;”分号结束,而宏定义的常量是预处理命令,不能用分号结束。

取消宏定义:

#undef 宏名或者宏函数名  如#undef PI

定义宏函数:

#define 宏函数名(参数表) 字符串 如#define ADD(x,y)  x+y

 

条件编译:

作用是用来定义源文件中的某些编译代码要在一定的条件下才参与编译,如果条件不满足,则不编译。利用条件编译可以使同一个源文件在不同的编译条件下,产生不同的目标程序。

ifdef-else-endif格式为:

#ifdef  标识符

           代码段1

#else

           代码段2

#endif

或:

#ifdef  标识符

           代码段1

#endif

过程为:当标识符被宏定义过,则对代码段1进行编译,生成目标程序,如果没有被定义,则对代码段2进行编译。在省略#else时,只有当标识符被定义时,才对代码段1进行编译

ifndef-else-endif格式为:

#ifndef  标识符

           代码段1

#else

           代码段2

#endif

或:

#ifndef 标识符

           代码段1

#endif

过程为:当标识符未被宏定义过,则对代码段1进行编译,生成目标程序,如果标识符被宏定义过,则对代码段2进行编译。在省略#else时,只有当标识符未被定义时,才对代码段1进行编译

if-else-endif格式为:

#if 常量表达式1

           代码段1

#elif 常量表达式2

          代码段2

。。。

#elif常量表达式n

          代码段n

#else

          代码段n+1

#endif

过程为:当常量表达式1为真时,编译代码段1,否则判断常量表达式2,如果为真,编译代码段n,如果常量表达式中没有一个为真,则编译代码段n+1,这时如果没有#else,就编译整个代码后面的代码。

 

头文件的编写

main.cpp中

#include"file1.h"

#include"file2.h"

void main(){

              ...

}

file1.h中:

#include"type.h"

file2.h中:

#include"type.h"

存在问题:在这样的一个结构,main.cpp中就会导致两次包含同一个头文件type.h,为了避免多次包含同一个头文件,只有头文件中自定义一个唯一的标识符,如果其被定义过,则头文件将不再被包含。具体做法是在type.h文件中增加如下内容:

#ifndef_TYPE_H_

#define_TYPE_H_

    //TYPE.h中的代码

#endif

_TYPE_H_被宏定义为type.h中的唯一一个文件标识符,当type.h第一次被包含时,会在程序代码中宏定义_TYPE_H_,这时因为_TYPE_H_还没有被定义,所以type.h中的代码段会被编译,当第2次再被包含时,因为_TYPE_H_已经被定义过,所以第2次包含的type.h中的代码段就不会被编译,至此就解决了多次包含的问题

注意:应该养成给每一个自定义的头文件都增加唯一的文件标识符,防止头文件被重复包含的习惯。