概述
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 的代码
*/
最后
以上就是美好电灯胆为你收集整理的#pragma push_macro("MACRO_NAME") 与 #pragma pop_macro("MACRO_NAME") 用法详解的全部内容,希望文章能够帮你解决#pragma push_macro("MACRO_NAME") 与 #pragma pop_macro("MACRO_NAME") 用法详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复