#pragma push_macro("MACRO_NAME") 与 #pragma pop_macro("MACRO_NAME") 用法详解

1. 解释 
    (1) #pragma push_macro("MACRO_NAME") 是把当前与宏 MACRO_NAME 相关联的字符串值保存到栈中; 
    (2) #pragma pop_macro("MACRO_NAME") 是把栈中之前保存的与宏 MACRO_NAME 相关联的字符串值重新关联到宏 MACRO_NAME 上. 
    
2. 说明 
    (1) 必须先用 push_macro 将宏 MACRO_NAME 所关联的字符串值压入栈, 然后才能用 pop_macro 将其弹出; 
    (2) 如果多次用 push_macro 将宏 MACRO_NAME 多次所关联的不同字符串值压入栈, 则栈中保存的是宏 MACRO_NAME 最后一次压入的, 即用 pop_macro 弹出的是宏 MACRO_NAME 最后一次 push_macro 入的; 
    (3) 用 push_macro 将多个宏压入栈中, 再用 pop_macro 弹出时, 弹出字符串值的规则不是"先进后出(FILO)"或"后进先出(LIFO)", 而是与 pop_macro 所要弹出的宏名相关.
        
        代码: 
        
        #define MACRO_NAME_1 1  
        #define MACRO_NAME_2 2 
        #define MACRO_NAME_3 3 
            cout << "MACRO_NAME_1 = " << MACRO_NAME_1 << endl; // 1 
            cout << "MACRO_NAME_2 = " << MACRO_NAME_2 << endl; // 2 
            cout << "MACRO_NAME_3 = " << MACRO_NAME_3 << endl; // 3 
         
        #pragma push_macro("MACRO_NAME_1") 
        #pragma push_macro("MACRO_NAME_2") 
        #pragma push_macro("MACRO_NAME_3") 
        #undef MACRO_NAME_1 
        #undef MACRO_NAME_2 
        #undef MACRO_NAME_3 
         
        #define MACRO_NAME_2 222 
            cout << "MACRO_NAME_2 = " << MACRO_NAME_2 << endl; // 222 
        #pragma push_macro("MACRO_NAME_2") 
        #undef MACRO_NAME_2 
         
        #define MACRO_NAME_1 11  
        #define MACRO_NAME_2 22 
        #define MACRO_NAME_3 33 
            cout << "MACRO_NAME_1 = " << MACRO_NAME_1 << endl; // 11 
            cout << "MACRO_NAME_2 = " << MACRO_NAME_2 << endl; // 22 
            cout << "MACRO_NAME_3 = " << MACRO_NAME_3 << endl; // 33 
        // 下面三句不需要
        // #undef MACRO_NAME_1 
        // #undef MACRO_NAME_2 
        // #undef MACRO_NAME_3 
         
        #pragma pop_macro("MACRO_NAME_1") 
        #pragma pop_macro("MACRO_NAME_3") 
        #pragma pop_macro("MACRO_NAME_2") 
            cout << "MACRO_NAME_1 = " << MACRO_NAME_1 << endl; // 1 
            cout << "MACRO_NAME_2 = " << MACRO_NAME_2 << endl; // 222 
            cout << "MACRO_NAME_3 = " << MACRO_NAME_3 << endl; // 3 
                
    (4) 对未定义的宏执行 push_macro 和 pop_macro 指令是正确的. 
        用 push_macro 将未定义的宏压入栈, 如果再压入了定义过的同名宏, 那 pop_macro 后该宏是最后压入的宏的定义; 如果没有再压入定义过的同名宏, 那 pop_macro 后该宏仍然是未定义的. 
    
        代码: 
        
        #include <iostream> 
 
        int main()
        {
        #ifndef MACRO_FOO 
            std::cout << "1 -> MACRO_FOO is not defined. /r/n"; 
        #endif 
 
        #pragma push_macro("MACRO_FOO") 
 
        #ifndef MACRO_FOO 
            std::cout << "2 -> MACRO_FOO is not defined. /r/n";  
        #endif 
 
        #undef MACRO_FOO // 对未定义的宏可以执行 undef 
 
        #define MACRO_FOO "macro_foo" 
 
        // #pragma push_macro("MACRO_FOO") // line 1 
 
        #ifdef MACRO_FOO 
            std::cout << "1 -> MACRO_FOO is defined. MACRO_FOO = " << MACRO_FOO << std::endl; 
        #endif 
 
        // #undef MACRO_FOO                // line 2
 
        #pragma pop_macro("MACRO_FOO") 
 
        #ifndef MACRO_FOO 
            std::cout << "3 -> MACRO_FOO is not defined. /r/n"; 
        #else
            std::cout << "2 -> MACRO_FOO is defined. MACRO_FOO = " << MACRO_FOO << std::endl;  
        #endif 
 
            return 0; 
        }
        
        输出: 
        
        1 -> MACRO_FOO is not defined.
        2 -> MACRO_FOO is not defined.
        1 -> MACRO_FOO is defined. MACRO_FOO = macro_foo
        3 -> MACRO_FOO is not defined. 
        
        加上代码中的 line 1 和 line 2, 将输出: 
        
        1 -> MACRO_FOO is not defined.
        2 -> MACRO_FOO is not defined.
        1 -> MACRO_FOO is defined. MACRO_FOO = macro_foo
        2 -> MACRO_FOO is defined. MACRO_FOO = macro_foo
        
    (5) 用 #define MACRO_NAME 方式定义宏时, push_macro 和 pop_macro 指令跟普通宏定义时相同, 只是弹出的宏仍然只是个标识符, 没有关联任何字符串值. 
    
        代码: 
        
        #define MACRO_FOO
        
        #pragma push_macro("MACRO_FOO") 
        
        #ifdef MACRO_FOO 
            #pragma message("1 -> MACRO_FOO is defined.") // 编译输出 
        #endif 
        
        #undef MACRO_FOO 
        
        #pragma pop_macro("MACRO_FOO")

        #ifdef MACRO_FOO 
            #pragma message("2 -> MACRO_FOO is defined.") // 编译输出 
        #endif 
            
3. 用法
    某段代码前后部分要使用某宏第一种定义, 中间部分要使用另一种定义, 这时可以这么做: 
    
    #define MACRO_FOO an_str_value // 宏 MACRO_FOO 的第一种定义 
    /*
        使用 MACRO_FOO 关联 an_str_value 的代码
    */ 
    #pragma push_macro("MACRO_FOO") // 将 MACRO_FOO 关联的 an_str_value 先保存起来 
    #undef MACRO_FOO // 这句不能忘记, 否则会出现宏重复定义的警告信息.  
    
    #define MACRO_FOO another_str_value // 宏 MACRO_FOO 的第二种定义 
    /*
        使用 MACRO_FOO 关联 another_str_value 的代码
    */ 
    
    // #undef MACRO_FOO // pop_macro 之前这句不需要, 因为并没有定义宏, 只是重新关联了字符串值而已.
    #pragma pop_macro("MACRO_FOO") // 将宏 MACRO_FOO 的值恢复为之前保存的 an_str_value 
    /*
        继续使用 MACRO_FOO 关联 an_str_value 的代码
    */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值