• 【转】C/C++指令 #undef ,#ifdef, #ifndef,#if的用法


    C/C++指令 #undef ,#ifdef, #ifndef,#if的用法 收藏
    #undef
      #undef 是在后面取消以前定义的宏定义
      该指令的形式为
      #undef 标识符
      其中,标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令。
      一旦定义预处理器标识符,它将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。
      在此程序中,我们将取消在先前程序中对预处理器的定义。  
          源代码:
          #define TRACE(x)
          #if DBG
              #undef TRACE
              #define TRACE(x) g_TraceCallback x    
          #else
              #ifndef TRACE
              #define TRACE(x)
              #endif
          #endif
          解析:
          #define TRACE(x)
          #if DBG //成立的话跑这支
              #undef TRACE //释放之前定义的 #define TRACE ,防止重复定义
              #define TRACE(x) g_TraceCallback x  
          #else // DBG 不成立 跑这支
              #ifndef TRACE //当TRACE 没有被定义
              #define TRACE(x) //宏定义
              #endif
          #endif// DBG
    #ifdef,#ifndef使用
        条件编译命令最常见的形式为:
        #ifdef 标识符
        程序段1
        #else
        程序段2
        #endif
        
        它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
        其中#else部分也可以没有,即:
        #ifdef
        程序段1
        #denif
        
        这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一定的差异。例如,当程式跑到else,如果TRACE没被定义,则下一句再定义
        源代码:
          #define TRACE(x)
          #if DBG
              #undef TRACE
              #define TRACE(x) g_TraceCallback x    
          #else
              #ifndef TRACE
              #define TRACE(x)
              #endif
          #endif
       解析:
          #define TRACE(x)
          #if DBG
               #undef TRACE
               #define TRACE(x) g_TraceCallback x    
          #else
               #ifndef TRACE //如果之前没定义,则跑下边定义------该例前边有#define TRACE(x) ,则后边的定义自动失效因此不会因为重复定义而出错
               #define TRACE(x) //定义
               #endif
           #endif
        
    我们有时也采用下面的形式:
        #ifndef 标识符
        程序段1
        #else
        程序段2
        #endif
        
        只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。
        以上两种形式用法差不多,根据需要任选一种,视方便而定。

        还有一种形式,就是#if后面的是一个表达式,而不是一个简单的标识符:
        #if 表达式
        程序段1
        #else
        程序段2
        #endif
       
    当表达式成立,则跑程序段1,否则跑程序段2
    注意:
              除#undef释放之前的宏定义可单独使用之外,
    #ifdef,#if,#ifndef均要与#endif配对
    如:
              #if...#else...#endif
              #ifdef...#endif
              #ifndef...#endif


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/michael_liuyong/archive/2009/06/05/4241128.aspx

  • 相关阅读:
    学号20145220《信息安全系统设计基础》第10周学习总结
    补发周四的博客。对之前的知识复习了一遍,因为要闭卷考试。
    jsp中文乱码
    redis做成windows服务
    poi导出excel打开文件时部分内容有问题
    mysql删除数据表时:Cannot delete or update a parent row: a foreign key constraint fails
    Oracle使用foreach批量操作数据
    Oracle数据库clob类型转String类型
    MAVEN配置多个仓库
    idea中maven项目明明有jar包还是爆红
  • 原文地址:https://www.cnblogs.com/zhwl/p/2759847.html
Copyright © 2020-2023  润新知