我可以在内部函数中禁用宏吗?

Can I disable a macro in an inner function?

本文关键字:内部函数 我可以      更新时间:2023-10-16

可能的重复项:
我可以重新定义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(...)版本,然后根据需要使用它。