使用条件条件编译指令,可以限制程序中的某些内容要在满足一定条件下才参与编译。因此,可以利用条件编译指令使同一个源程序在不同的编译环境下产生不同的目标代码。在头文件中使用#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