#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")
}
#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")
}
我刚试过vs2017,没什么不同。没有警告/错误,工作正常,输出相同:
8
4
所以,我的问题是:
答案 0 :(得分:3)
非常粗略地说,push_macro
表示“存储宏的当前定义”,pop_macro
表示“恢复已保存的宏定义”。
这两个命令在当前翻译单元的范围内都有意义(即当前编译的cpp文件,包括标题)。
因此,如果您不调用pop_macro
,则不会恢复宏的定义,这是完全允许的,并不意味着UB。
你在示例“使用pop_macro”结尾处放置的pop_macro
实际上没有任何效果,因为它之后没有代码会被编译
请注意,我们正在讨论在编译时发生的事情,而不是在运行时