zoukankan      html  css  js  c++  java
  • ifdef等宏的妙用

    条件编译

    一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。
    条件编译命令最常见的形式为:

    #ifdef 标识符 
    #else程序段2 
    #endif 

    它的作用是:

    当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 其中#else部分也可以没有,即:

    #ifdef 程序段1 
    #endif

    这里的“程序段”可以是语句组,也可以是命令行。
    防止双重定义的错误
    在头文件中使用#ifdef和#ifndef是非常重要的,可以防止双重定义的错误。如你在头文件aaa.h中定义了一个类aaa如下:

    class aaa   
    {
    };  

    如果两次#include "aaa.h"(不见得是直接,也有可能两个不同的头文件中都包含了这个头文件)就会出错,因为相同的类不能定义两次。把aaa.h稍做修改:

    #ifdef _aaa_
    #define _aaa_
    class aa
    {
    }
    #endif

    #ifdef和#endif必须成对使用。

    从理论上讲可以出现在任何地方(头文件和实现文件中), 通常为了防止头文件被多次包含,在头文件中使用是必须的

     如:#ifndef   MY_HEAD_H   //头文件开头,名字是任意的,注意不要和其它头文件冲突        
      头文件声明   
    #endif     //头文件结尾

    Demo1

    如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一定的差异。
    例如,我们有一个数据类型
    在Windows平台中,应该使用long类型表示
    而在其他平台应该使用float表示
    这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译:

    #ifdef WINDOWS 
    #define MYTYPE long 
    #else 
    #define MYTYPE float 
    #endif 

    这样,源程序可以不必作任何修改就可以用于不同类型的计算机系统。

    Demo2

    在调试程序时,常常希望输出一些所需的信息,而在调试完成后不再输出这些信息。

    #ifdef DEBUG
    print ("device_open(%p)
    ", file);
    #endif

    如果在它的前面有以下命令行:

    #define DEBUG

    则在程序运行时输出file指针的值
    人可能觉得不用条件编译也可达此目的,即在调试时加一批printf语句,调试后一一将printf语句删除去。的确,这是可以的。但是,当调试时加的printf语句比较多时,修改的工作量是很大的。

    用条件编译,则不必一一删改printf语句,只需删除前面的一条“#define DEBUG”命令即可,这时所有的用DEBUG作标识符的条件编译段都使其中的printf语句不起作用,即起统一控制的作用,如同一个“开关”一样

    Demo3 ifndef

    有时也采用下面的形式:

    #ifndef 标识符
        // 程序段1
    #else
        // 程序段2
    #endif

    只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段

    Demo4

    还有一种形式,就是#if后面的是一个表达式,而不是一个简单的标识符:

    #if 表达式
        // 程序段1
    #else
        // 程序段2
    #endif

    它的作用是:当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。

    #define LETTER 1

    通过条件表达式可以确认不同的状态,类似于#define,可以通过改值的方式修正编译状态
    而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。

    Test1

    测试发现,如果想要切换Debug和Release模式,需要使用#ifdef _DEBUG

    #ifdef _DEBUG
    #define OUTPUT "This is DebugMode"
    #else
    #define OUTPUT "This is OtherMode"
    #endif // DEBUG
    int main()
    {
        cout << OUTPUT << endl;
        system("Pause");
        return 0;
    }

    Test2

    在程序中定义字段的时候,如果有定义,则使用片段1,如果没有定义,则使用片段2





  • 相关阅读:
    HBase 高性能加入数据
    Please do not register multiple Pages in undefined.js 小程序报错的几种解决方案
    小程序跳转时传多个参数及获取
    vue项目 调用百度地图 BMap is not defined
    vue生命周期小笔记
    解决小程序背景图片在真机上不能查看的问题
    vue项目 菜单侧边栏随着右侧内容盒子的高度实时变化
    vue项目 一行js代码搞定点击图片放大缩小
    微信小程序进行地图导航使用地图功能
    小程序报错Do not have xx handler in current page的解决方法
  • 原文地址:https://www.cnblogs.com/EltonLiang/p/9134337.html
Copyright © 2011-2022 走看看