我有一个应用程序在应用程序生命周期中多次从第三方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;
}
答案 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>