在C++中存在三种预编译的行为,1.宏展开 2.#include包含 3.条件限定#if #endif预判断 。 下面我们来逐一的分析这三种情况的用途。
1.宏:定义的格式为 #define PI 3.1415 //这就是一个宏定义。
它的优点:在程序的任何位置凡是应用到3.1415的地方都可以用PI来代替。如果以后需求改变了,不采用 3.1415值时,可以很方便的修改宏的定义即可。而不需要到处去找程序中3.1415的值修改。极大的提高了可维护性。正是因为这个原因,MFC框架中采用大量的宏定义。
2.#include:预包含处理指令,这里存在二种形式的定义 1.#include <xx.h> 2. #include "xx.h" 。
1.#include <xx.h> 用尖括号包含的头文件,系统会直接在相应的标准程序库中查找
2.#inclde "xx.h" 用引号包含的头文件,系统会优先在当前目录(也就是你自己定义的头文件所有的工程目录下)查找,找不到才会在标准库中查找。
应用的场合:把相应头文件中代码合并到当前包含文件中形成一个完整的代码文件。
3.条件限定:即根据相应的条件来预编译指定的代码段,如果条件成立则加入到编译代码中,不成立则直接忽略。存在有二种形式的条件限定
1.#if #else #elif # endif 形式的条件判断
代码示例:
#include <iostream>
using namespace std;
#define flag 1//定义宏作为标识
#define flag1 0
int main(){
#if flag //flag为1, 则执行下面代码
cout<<"in flag"<<endl;
#elif flag1 //常量表达式
cout<<"in flag1 "<<endl;
#else
cout<<"last else"<<endl;
#endif //条件限定结束符
}
2.#ifdef #ifndef #else #endif 形式条件判断
代码示例:
#include <iostream>
using namespace std;
#define debug
int main(){
#ifndef debug //如果没有定义宏debug,执行下面语句
cout<<"in first code"<<endl;
#else //否则执行下面语句
cout<<"in second code"<<endl;
#endif //条件限定结束符
}
应用的场合:适用于程序调试。做为一个开关,非常方便的开启所有调用语句,或关闭所有调用语句。当设定的标识符为false时则关闭调用语句,否则打开。做为预处理程序处理的对象,相应的如果关闭调试语句,那么这些调试语句就会被预处理程序所忽略,而不会编译到产品程序中。如果产品中出现了错误,那么可以方便的打开所有调试语句进行分析,这也是条件限定诱人之处。