14.4条件编译条件编译属于预处理程序,包括之前讲的宏,都是程序在编译之前做的一些必要的处理,这些都不是实际程序功能代码,而仅仅是告诉编译器需要进行的特定操作等。 条件编译通常有三种用法,第一种表达式: #if 表达式 程序段 1 #else 程序段 2 #endif 作用:如果表达式的值为“真”(非0),则编译程序段1,否则,编译程序段2。在使用中,表达式通常是一个常量,事先用宏来进行声明,通过宏声明的值来确定到底执行哪段程序。 比如公司开发了同类的两款产品,这两款产品的功能有一部分是相同的,有一部分是不同的,同样所编写的程序大部分的代码是一样的,只有少部分有区别。这个时候为了方便程序的维护,可以把两款产品的代码写到同一个工程程序中,然后把其中有区别的功能利用条件编译。 #define PLAN 0 #if (PLAN == 0) 程序段1 #else 程序段2 #endif 这样写之后,当要编译款式1的时候,把PLAN宏声明成0即可,当要编译款式2的时候,把宏声明的值改为1或其它值即可。 第二种表达式和第三种表达式是类似的,使用哪一种要看具体情况或个人偏好。 表达式二: #ifdef 标识符 程序段1 #else 程序段2 #endif 表达式三: #ifndef 标识符 程序段1 #else 程序段2 #endif 在本章的示例中使用到了表达式三,表达式三的作用是:如果标识符没有被#define命令所声明过,则编译程序段1,否则则编译程序段2。此外,命令中的#else部分是可以省略的。表达式二和表达式三正好相反,实际#ifndef就是if no define的缩写。 在头文件的编写过程中,为了防止命名的错乱,每个.c文件对应的.h文件内的条件编译的命名,也使用这个头文件的名字,并且大写,在中间加上下划线,比如这个main.h的结构,首先要这样写: #ifndef _MAIN_H /*本段程序是写在main.h文件中,程序段1为外部变量;外部函数;自定义数据类型等*/ #define _MAIN_H 程序段1 #endif 这样说明的意思是,如果这个_MAIN_H没有声明过,那么就声明_MAIN_H,并且的程序段1是有效的,最终结束;那么如果_MAIN_H已经声明过了,那么也就不用再声明了,同时程序段1也就无效了。 前边头文件重复包含的问题这样就被解决了,编译器在预编译a.h时进行了#define _MAIN_H,而在预编译b.h时,#ifndef _MAIN_H这一个条件就不成立,也就不会编译b.h当中的这部分内容,这样就有效的解决了头文件重复包含的问题。
|