条件编译常三种常见的形式
if else
#ifdef_XXXX
...程序段1...
#else
...程序段2...
#endif
这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
if not else
#ifndef_XXXX
...程序段1...
#else
...程序段2...
#endif
这里使用了#ifndef,表示的是ifnotdef。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。
If else if
#if常量
...程序段1...
#elif<常量表达式2>
...程序段2...
#elif<常量表达式3>
...程序段3...
#else
...程序段2...
#endif
这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。
有人会问:不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。
则在程序运行时输出file指针的值,以便调试分析。调试完成后只需将这个define命令行删除即可。有人可能觉得不用条件编译也可达此目的,即在调试时加一批printf语句,调试后一一将printf语句删除去。的确,这是可以的。但是,当调试时加的printf语句比较多时,修改的工作量是很大的。用条件编译,则不必一一删改printf语句,只需删除前面的一条“#defineDEBUG”命令即可,这时所有的用DEBUG作标识符的条件编译段都使其中的printf语句不起作用,即起统一控制的作用,如同一个“开关”一样。
判断式
编译器支持 && || 这样的逻辑判断式
defined(x)是常用的判断宏是否定义的判断式
例如
#undef CYDLLEXP
#ifdef _BUILD_CYWinBase
#define CYDLLEXP__declspec(dllexport)
#pragma message ("\n*** 正在导出CYWinBase... ")
#else
#if defined(_ARXAPP)|| defined(_DBXAPP)
/// Acad开发环境下永远使用发行版的Dll.
#pragma message("\n*** 正在链接发行版CYWinBase.lib ...")
#pragmacomment(lib, "CYWinBase.lib")
#else
#define CYDLLEXP__declspec(dllimport)
#pragma message("\n*** 正在导入WinBase... ")
#ifdef _DEBUG
#pragma message("\n*** 正在链接调试版CYWinBased.lib ...")
#pragmacomment(lib, "CYWinBased.lib")
#else
#pragma message("\n*** 正在链接发行版CYWinBase.lib ...")
#pragmacomment(lib, "CYWinBase.lib")
#endif // _ARXAPP
#endif
#endif // _BUILD_WinBase