2

可能重复:
我可以重新定义一个 C++ 宏然后再定义它吗?

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

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

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

我有 3rdParty.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;    
}

3rdParty.cpp:

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

2 回答 2

2

这里的问题是,除非它被内联,否则函数将被标记化并编译一次。这意味着在调用函数时是否定义了宏并不重要,只有在编译函数本身时才重要。

于 2012-12-04T10:05:44.147 回答
1

如果您有权访问 的定义_3RDPARTY_ASSER,例如

#define _3RDPARTY_ASSERT definition

然后保存该定义:

#define SAVE_ASSERT definition

然后在您的代码中,当您不想要一个断言时,您可以#undef _3RDPARTY_ASSERT#define它到其他东西。

在该代码之后,您可以通过以下方式重新启用旧定义

#define _3RDPARTY_ASSERT SAVE_ASSERT

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

于 2012-12-04T10:08:45.807 回答