#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 的代码
    */

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值