首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果#语用push_macro而没有#语用pop_macro,会发生什么呢?

如果#语用push_macro而没有#语用pop_macro,会发生什么呢?
EN

Stack Overflow用户
提问于 2017-07-31 14:47:18
回答 1查看 2.9K关注 0票数 3

#pragma pop_macro("int")

代码语言:javascript
复制
#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")
}

没有#语用pop_macro("int")

代码语言:javascript
复制
#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上尝试过,没有任何different.both没有警告/错误,工作正常,并具有相同的输出:

8 4.

所以,我的问题是:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-31 15:00:13

非常粗野地说,push_macro的意思是“存储当前宏的定义”,pop_macro的意思是“恢复保存的宏定义”。

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

因此,如果不调用pop_macro,就不会简单地还原宏的定义,这是完全允许的,并不意味着UB。

在示例"With pop_macro“末尾放置的pop_macro实际上没有任何效果,因为后面没有编译的代码。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45419020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档