#pragma pop_macro("int")#include <iostream>
using namespace std;
#define int double
void main()
{
int iOne = 1;
cout << sizeof(iOne) << endl;
#pragma push_macro("int")
#undef int
int iTwo = 2;
cout << sizeof(iTwo) << endl;
#pragma pop_macro("int")
}
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
using namespace std;
#define int double
void main()
{
int iOne = 1;
cout << sizeof(iOne) << endl;
#pragma push_macro("int")
#undef int
int iTwo = 2;
cout << sizeof(iTwo) << endl;
//#pragma pop_macro("int")
}
Run Code Online (Sandbox Code Playgroud)
我刚刚在 vs2017 上尝试过,没有什么不同。两者都没有警告/错误,工作正常,并且具有相同的输出:
8
4
所以,我的问题是:
非常粗略地说,push_macro意味着“存储宏的当前定义”,pop_macro意味着“恢复保存的宏定义”。
这两个命令在当前翻译单元(即当前编译的 cpp 文件并包括头文件)的范围内都有意义。
因此,如果您不调用pop_macro,则宏的定义将不会被恢复,这是完全允许的,并不意味着 UB。
您pop_macro放在示例“With pop_macro”末尾的内容实际上没有任何效果,因为它后面没有将被编译的代码
请注意,我们谈论的是编译时发生的事情,而不是运行时发生的事情