zoukankan      html  css  js  c++  java
  • 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
     
     
  • 相关阅读:
    Spring Boot将Mybatis返回结果转为驼峰的三种实现方式
    Lodash-一个好用的JavaScript工具库
    基于Docker搭建LNMP环境并启用ssl证书(certbot)
    CentOS忘记mariadb/mysql root密码解决办法
    Debian如何安装curl?
    SpringBoot Controller如何接收数组参数?
    nginx web服务器概念了解 配置
    c语言二维数组的转置
    顺序表有序插入数据
    elasticsearch master_not_discovered_exception
  • 原文地址:https://www.cnblogs.com/vranger/p/3093884.html
Copyright © 2011-2022 走看看