关于#pragma push_macro("new") .

在三方库源码中,我们经常看到这样的代码:

#pragma push_macro("new")

#undef new

// do something with new

......

#pragma pop_macro("new")

它的作用就是将宏定义new压入栈并取消它(指的是宏)的定义,如此一来,new的本来含义便获得了恢复,使用完毕后将宏定义new弹出栈,恢复宏定义。

不过,仍有下面两个问题需要回答。

1)宏定义名不会与关键字new冲突吗?

2)宏定义new有何作用?

问题1

    宏定义名若与保留的关键字相同,编译器并不会提示错误,而是用最新定义的宏定义代替关键字发挥作用。下面是一个例子,定义了宏int。例程能顺利通过编译链接,其运行结果为8,4,8,与预期相同。

// ConsoleTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#define int double

void _tmain(int argc, _TCHAR* argv[])
{
	int iOne = 1;
	cout<<sizeof(iOne)<<endl;
    #pragma push_macro("int")
    #undef int
	int iTwo = 2;
	cout<<sizeof(iTwo)<<endl;
    #pragma pop_macro("int")

	int iSecond=2;
	cout<<sizeof(iSecond)<<endl;
	system("pause");
}


 

解析:运行结果为8 ,4,8

        宏定义,如#define PI 3.1415926   把程序中出现的PI全部换成3.1415926

        #define int double   该句话表明,把程序中出现int的地方全部替换为double ,(int iOne = 1;cout<<sizeof(iOne)<<endl;相当于iOne为double类型,所以输出8)

 

#pragma push_macro("int")

#undef intint iTwo = 2;

cout<<sizeof(iTwo)<<endl;

#pragma pop_macro("int")

      
上面几句的意思是,将将宏定义int压入栈并取消它(指的是宏)的定义,如此一来,int的本来含义便获得了恢复,即int仍代表int。使用完毕后将宏定义int弹出栈,恢复宏定义即int代表double。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IvanLJF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值