gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:13:08 29 4
gpt4 key购买 nike

使用#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("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


所以,我的问题是:

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

最佳答案

很粗暴的说,push_macro的意思是“存储宏的当前定义”,pop_macro的意思是“恢复保存的宏定义”。

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

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

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

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

关于c++ - 如果#pragma push_macro 没有#pragma pop_macro 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419020/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com