我可以在内部函数中禁用宏吗?
Can I disable a macro in an inner function?
可能的重复项:
我可以重新定义C++宏然后重新定义它吗?
我有一个应用程序,它在应用程序生命周期内多次调用来自第三方 SDK 的函数。这个第三方函数检查其_3RDPARTY_ASSERT(它是_ASSERT的包装器)是否存在一些错误。
我的问题是,在其中一个调用中,我有时会遇到错误(并在之后处理它)。我想在这种情况下禁用断言,因为它在调试时很烦人,但在所有其他情况下保留它。
我试图用编译指示处理它 push_macro/pop_macro 但我还没有找到方法。这可能吗?
我有第三方的来源.cpp但宁愿不碰它。
这将是代码的简化版本:
我的.cpp:
#include "3rdparty.h"
HRESULT MyMethod(...)
{
HRESULT hr;
hr = _3rdParty(...);
if (SUCCEEDED(hr))
hr = _3rdParty(...);
if (SUCCEEDED(hr))
hr = _3rdParty(...);
...
if (SUCCEEDED(hr))
hr = _3rdParty(...); // This call shouldn't throw the assertion, as I expect it to fail sometimes!
if (FAILED(hr))
doSomething();
else
doSomethingElse();
...
if (SUCCEEDED(hr))
hr = _3rdParty(...);
return hr;
}
第三方.cpp:
...
#define _3RDPARTY_ASSERT (_ASSERT)
...
HRESULT _3rdParty(...)
{
HRESULT hr;
hr = SomeFunction();
_3RDPARTY_ASSERT(SUCCEEDED(hr));
return hr;
}
这里的问题是,除非它是内联的,否则该函数将被标记化并编译一次。这意味着在调用函数时是否定义宏并不重要,只有在编译函数本身时才定义宏。
如果您可以访问_3RDPARTY_ASSER
的定义,例如
#define _3RDPARTY_ASSERT definition
然后保存该定义:
#define SAVE_ASSERT definition
然后在代码中的位置,当你不想要断言时,你可以#undef _3RDPARTY_ASSERT
或#define
它到其他东西。
在该代码之后,您可以通过以下方式重新启用旧定义
#define _3RDPARTY_ASSERT SAVE_ASSERT
我更喜欢的第二个解决方案是:如果您有权访问 3'd 派对代码,您可以创建另一个不断言的_3rdParty(...)
版本,然后根据需要使用它。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以在 C++ 中的函数体之外进行操作吗?
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 无论如何,我可以确定构造函数是否存在吗?
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 我可以将向量作为initial_sum和不同的函数传递给 std::累积吗?
- 我可以这样调用函数吗?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 我可以在Visual Studio 2019上的项目下使用多个主函数吗?
- 我可以在构造函数的主体中转发构造吗?
- 我如何获取数组的大小,以便我可以从函数声明所述数组
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 我可以在类中存储构造函数的模板参数吗?
- 我可以动态创建新地图并作为函数参数传递吗?
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 我可以使用在类构造函数中初始化的流类型的成员变量吗?
- 我可以在函数中调用该类中的类吗?
- 我可以在内部函数中禁用宏吗?
- 我可以从外部访问函数内部的静态变量吗?