条件编译

条件编译常三种常见的形式

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

 

posted @ 2012-09-12 00:11  胖胖熊  阅读(200)  评论(0编辑  收藏  举报