有关 #pragma push_macro("new") 的用法

本文介绍如何解决在MFC应用程序中创建托管类型实例时出现的C3828错误。通过暂时取消定义new运算符,可以避免该错误,并在完成托管代码段后恢复原来的new运算符定义。

 当使用 C++ 托管扩展时,如果尝试在 MFC 应用程序内创建托管类型的实例,则编译器还将生成 C3828。为了跟踪内存的使用情况,在 MFC 调试版本中使用时 MFC 重定义 new 运算符。由于此重定义的缘故,会在 MFC 应用程序中创建托管类的实例,从而导致错误。在将现有 MFC 代码移植到公共语言运行库时通常会发生这种情况。对于发布版本不会发生此错误,这是因为 MFC 不重定义 new 运算符。
若要避免此错误,请在创建托管类型的实例前,使用 #undef 和 push_macro 指令暂时取消定义 new 运算符。在最后一行托管代码的后面,使用 pop_macro 还原先前的 new 运算符定义。

#pragma push_macro("new")
#undef new

String* s;
s = new String("Hello world!");
#pragma pop_macro("new")

详细信息清参考MSDN文档:http://msdn2.microsoft.com/zh-cn/library/b3z6z0ay(VS.80).aspx

希望能够对您有所帮助。

Jasson Wang
在线技术支持工程师
微软全球技术支持中心

// cstdlib standard header (core) // Copyright (c) Microsoft Corporation. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #ifndef _CSTDLIB_ #define _CSTDLIB_ #include <yvals_core.h> #if _STL_COMPILER_PREPROCESSOR #include <math.h> #include <stdlib.h> #pragma pack(push, _CRT_PACKING) #pragma warning(push, _STL_WARNING_LEVEL) #pragma warning(disable : _STL_DISABLED_WARNINGS) _STL_DISABLE_CLANG_WARNINGS #pragma push_macro("new") #undef new _EXTERN_CXX_WORKAROUND // <stdlib.h> has abs(long) and abs(long long) _NODISCARD _Check_return_ inline double abs(_In_ double _Xx) noexcept /* strengthened */ { return _CSTD fabs(_Xx); } _NODISCARD _Check_return_ inline float abs(_In_ float _Xx) noexcept /* strengthened */ { return _CSTD fabsf(_Xx); } _NODISCARD _Check_return_ inline long double abs(_In_ long double _Xx) noexcept /* strengthened */ { return _CSTD fabsl(_Xx); } _END_EXTERN_CXX_WORKAROUND _STD_BEGIN _EXPORT_STD using _CSTD size_t; _EXPORT_STD using _CSTD div_t; _EXPORT_STD using _CSTD ldiv_t; _EXPORT_STD using _CSTD abort; _EXPORT_STD using _CSTD abs; _EXPORT_STD using _CSTD atexit; _EXPORT_STD using _CSTD atof; _EXPORT_STD using _CSTD atoi; _EXPORT_STD using _CSTD atol; _EXPORT_STD using _CSTD bsearch; _EXPORT_STD using _CSTD calloc; _EXPORT_STD using _CSTD div; _EXPORT_STD using _CSTD exit; _EXPORT_STD using _CSTD free; _EXPORT_STD using _CSTD labs; _EXPORT_STD using _CSTD ldiv; _EXPORT_STD using _CSTD malloc; _EXPORT_STD using _CSTD mblen; _EXPORT_STD using _CSTD mbstowcs; _EXPORT_STD using _CSTD mbtowc; _EXPORT_STD using _CSTD qsort; _EXPORT_STD using _CSTD rand; _EXPORT_STD using _CSTD realloc; _EXPORT_STD using _CSTD srand; _EXPORT_STD using _CSTD strtod; _EXPORT_STD using _CSTD strtol; _EXPORT_STD using _CSTD strtoul; _EXPORT_STD using _CSTD wcstombs; _EXPORT_STD using _CSTD wctomb; _EXPORT_STD using _CSTD lldiv_t; _EXPORT_STD using _CSTD getenv; _EXPORT_STD using _CSTD system; _EXPORT_STD using _CSTD atol 代码说是有问题,就是上述两个,给出正确的代码
07-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值