如果 #pragma push_macro 没有 #pragma pop_macro 会发生什么?

陳 力*_*陳 力 3 c++ visual-studio

#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)

没有 #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)

我刚刚在 vs2017 上尝试过,没有什么不同。两者都没有警告/错误,工作正常,并且具有相同的输出:

8

4


所以,我的问题是:

  • 为什么 vs 允许这种行为?
  • 是UB吗?

Gia*_*olo 5

非常粗略地说,push_macro意味着“存储宏的当前定义”,pop_macro意味着“恢复保存的宏定义”。

这两个命令在当前翻译单元(即当前编译的 cpp 文件并包括头文件)的范围内都有意义。

因此,如果您不调用pop_macro,则宏的定义将不会被恢复,这是完全允许的,并不意味着 UB。

pop_macro放在示例“With pop_macro”末尾的内容实际上没有任何效果,因为它后面没有将被编译的代码

请注意,我们谈论的是编译时发生的事情,而不是运行时发生的事情