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

时间:2017-07-31 14:47:18

标签: 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")
}

没有#pragma pop_macro(&#34; int&#34;)

#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

所以,我的问题是:

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

1 个答案:

答案 0 :(得分:3)

非常粗略地说,push_macro表示“存储宏的当前定义”,pop_macro表示“恢复已保存的宏定义”。

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

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

你在示例“使用pop_macro”结尾处放置的pop_macro实际上没有任何效果,因为它之后没有代码会被编译

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