C++ 条件编译指令和defined 操作符

本文详细介绍了条件编译指令的五种形式及其在不同编译环境下的应用,包括如何防止头文件的多重包含,避免编译错误。通过使用#if、#ifdef、#ifndef等指令,可以使同一源程序在不同环境下生成差异化的目标代码。

使用条件条件编译指令,可以限制程序中的某些内容要在满足一定条件下才参与编译。因此,可以利用条件编译指令使同一个源程序在不同的编译环境下产生不同的目标代码。在头文件中使用#ifdef和#ifndef是非常重要的,可以防止双重定义错误的出现。

 常用的条件编译语句有下列5种形式:

形式一

#if 常量表达式
    程序段            //当“常量表达式”为非零时,编译此程序段
#endif

此形式是条件编译语句最简单的形式,和if语句的使用方法原理上一样,当#if后的常量表达式为非零时,才会执行程序段,否则就跳过此程序段。

形式二

#if 常量表达式
    程序段1            //当“常量表达式”为非零时,编译此程序段
#else
    程序段2            //当“常量表达式”为零时,编译此程序段
#endif

此形式的使用方法和if else语句的使用方法原理上一样,当#if后的常量表达式为非零时,会执行程序段1,常量表达式为零时,会执行程序段2。

形式三

#if 常量表达式1
    程序段1            //当“常量表达式1”为非零时,编译此程序段
#elif 常量表达式2
    程序段2            //当“常量表达式1”为零,“常量表达式2”为非零时,编译此程序段
......

#elif 常量表达式n
    程序段n            //当“常量表达式1”、...、“常量表达式n-1”均为零,“常量表达式n”为非零时,编译此程序段
#else
    程序段n+1            //其他条件下,编译此程序段
#endif

此形式的使用方法和if -else if...-else的使用方法如出一辙,就不再细说了。

形式四:(#ifdef

#ifdef 标识符
    程序段1
#else
    程序段2
#endif

 此形式中,如果“标识符”经过#define定义过,且未经过#undef删除,则编译程序段1,否则编译程序段2。如果没有程序段2,则#else可以省略。

形式五:(#ifndef

#ifndef 标识符
    程序段1
#else
    程序段2
#endif

此形式中,如果“标识符”未被#define定义过,则编译程序段1,否则编译程序段2。如果没有程序段2,则#else可以省略。此形式,常常用来避免重复包含 .h 文件,出现编译错误。会将 .h 文件写成如下形式:

//***.h
#ifndef _***_H_
#define _***_H_
...
...
...
#endif

这样就不会出现重复定义的错误了。首先判断标识符_***_H_是否被定义过,若_***_H_被定义过,则说明文件 .h 调用过一次;若再次调用时,因为_***_H_被定义,就会跳过这个程序段,就不会出现重复定义的问题。

defined 操作符

defined是一个预处理操作符,而不是指令,因此 不要以#开头。defined操作符的使用形式为:

defined  (标识符)

若“标识符”在此前经过#define定义过,并且未经过#undef删除,上述表达式为非0,否则上述表达式的值为0。下面两种写法完全等效的:

#ifndef _***_H_
#define _***_H_
...
...
...
#endif

等价于

#if!defined (_***_H_)
#define _***_H_
...
...
...
#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值