C++中的编译预处理命令

C++中可以写一些共编译程序使用的命令:编译预处理命令,这些命令并不是C++程序所要完成的功能,而是对于编译过程给出指导,其功能有编译预处理程序来完成。C++的编译预处理命令主要有:文件包含命令(#include),宏定义(#define)以及条件编译命令。下面分别对其做介绍:

*文件包含命令(#include)
在C++中,一个模块通常有两个源文件构成,一个是.h文件,用于存放模块的接口定义;另一个是.cpp文件,用于存放模块的实现。在一个模块中要用到另一个模块中定义的程序实体时,需要在前者的.cpp文件中用文件包含命令(#include)把后者的.h文件包含进来。其格式为:#include<文件名>或#include"文件名"。文件包含命令的含义是:在编译前,用命令中的文件名所指定的文件内容替换该命令,<>表示在系统指定的目录下寻找该文件,""表示先在包含#include命令的文件目录下寻找,若找不到在到系统指定的目录下寻找。

*宏定义(#define)
在C++中,宏定义有四种格式
(1)define <宏名> <文字串> 含义:在编译前,把程序文本中出现<宏名>的地方用<文字串>替换,主要用于符号常量的定义。如:define PI 3.14,程序中所有以PI为标识符的单词均被替换为3.14
(2)define <宏名>(<参数表>) <文字串> 含义:在编译前,把程序中出现<宏名>的地方用<文字串>替换,并且,<文字串>中的参数(相当于形参)将替换成使用该<宏名>的地方所提供的参数(相当于实参)。这种宏定义主要解决对小函数调用效率不高的问题(使用内联函数应该是替代该方案的一个不错选择)。如:#define max(a,b) (((a)>(b))?(a):(b)) 注意不能写成#define max(a,b) a>b?a:b 原因请看下例:10+max(x,y)+5,使用前者替换成10+(((x)>(y))?(x):(y))+5,后者则替换成10+x>y:?x:y+5,结果显然不对。
(3)define <宏名> 含义:告诉编译程序该<宏名>已被定义,并不做任何的文本替换,其作用是实现条件编译。
(4)#undef <宏名> 含义:取消某个宏名的定义,其后的<宏名>不再进行替换和不再有宏定义。

*条件编译
条件编译主要有一下三个用途:
(1)处理某个.h文件被多个源文件重复包含的问题。例如对下面的MyClass.h文件由于在其中加入了MYCLASS_H的条件编译命令,这样重复包含该头文件多次就不会造成重复声明或定义的问题。
//MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
...//MyClass的声明或定义
#endif
(2)基于多环境的程序编制
有一些程序需要在不同的环境(如window或UNIX等)中运行,而在不同的环境中实现某些功能的代码是不同的,所以我们可以在同一个程序中,对环境有关的代码进行分别编写,而与环境无关的代码只编写一次,在编译时,由编译程序根据不同的环境来选择对程序中相应的与环境有关的代码进行编译,如下面的条件编译命令
#ifdef WINDOWS
...//适合Windows的代码
#elif UNIX
...//适合UNIX的代码
#elif SOLARIS
...//适合Solaris的代码
#else
...//适合其他环境的代码
#endif
...//与环境无关的代码
(3)程序调试利用下面这段条件编译命令,可以只在调试状态下(定义了宏名DEBUG)执行"..."所代表的调试信息代码,具体不多说,因为现在的IDE功能很强大,调试都是自带的,而且非常好。
#ifdef DEBUG
...//调试信息
#endif
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值