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

时间:2012-12-04 09:59:29

标签: c++ visual-studio-2010

  

可能重复:
  Can I redefine a C++ macro then define it back?

我有一个应用程序在应用程序生命周期中多次从第三方SDK调用函数。第三方函数使用_3RDPARTY_ASSERT(它是_ASSERT的包装)检查一些错误。

我的问题是,在其中一个调用中,我有时会遇到错误(并在之后处理)。我想在这种情况下禁用断言,因为它在调试时非常烦人,但在所有其他情况下都要保留它。

我试过用pragma push_macro / pop_macro处理它,但我还没找到办法。 这可能吗?

我有3rdParty.cpp的来源,但不想触摸它。

这将是代码的简化版本:

mine.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;    
}

3rdParty.cpp:

...
#define _3RDPARTY_ASSERT (_ASSERT)
...
HRESULT _3rdParty(...)
{
    HRESULT hr;
    hr = SomeFunction();
    _3RDPARTY_ASSERT(SUCCEEDED(hr));
    return hr;
}

2 个答案:

答案 0 :(得分:2)

这里的问题是,除非内联,否则该函数将被标记化并编译一次。这意味着在调用函数时,无论是否定义宏都无关紧要,只有在编译函数本身时才会定义。

答案 1 :(得分:1)

如果您可以访问_3RDPARTY_ASSER的定义,例如

#define _3RDPARTY_ASSERT definition

然后保存该定义:

#define SAVE_ASSERT definition

然后,在您不想要断言的代码中,您可以#undef _3RDPARTY_ASSERT#define将其转换为其他内容。

在该代码之后,您可以通过

重新启用旧定义
#define _3RDPARTY_ASSERT SAVE_ASSERT

我更喜欢的第二个解决方案是:如果您可以访问3'd聚会代码,则可以创建另一个版本的_3rdParty(...),该版本不会断言,然后根据需要使用它。 / p>