【问题标题】:Can I disable a macro in an inner function? [duplicate]我可以在内部函数中禁用宏吗? [复制]
【发布时间】:2012-12-04 09:59:28
【问题描述】:

可能重复:
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;
}

【问题讨论】:

  • @Jon:这不是重复的。这个问题是关于一般情况,有一个相对简单的解决方案,这是关于一个没有明显解决方案的具体情况。
  • 你是对的,对不起。
  • 关门了?人们不知道如何阅读了吗?

标签: c++ visual-studio-2010


【解决方案1】:

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

【讨论】:

  • 我知道...我希望有某种解决方法:)
  • 由于您想更改函数的定义方式,但仅在一次特定调用中,我真的不知道如何。对不起。有没有其他方法可以先处理,然后保存错误信息以供以后处理?
  • 我不这么认为。我可以添加一个 _3rdParty_NoAssert() 具有完全相同的代码但没有断言。不过,我试图避免这种情况。
  • 他们 恐怕我看不到您的问题的解决方案。
【解决方案2】:

如果你可以访问_3RDPARTY_ASSER的定义,喜欢

#define _3RDPARTY_ASSERT definition

然后保存该定义:

#define SAVE_ASSERT definition

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

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

重新启用旧定义
#define _3RDPARTY_ASSERT SAVE_ASSERT

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

【讨论】:

  • 除非他想在调用中禁用它,而不是在宏本身指定的地方,所以在那时重新定义宏不会有什么不同。但是,您的第二个解决方案似乎是合理的。
  • 谢谢!正如 Agentlien 所说,第一部分对我的具体问题没有用处。我担心我将不得不创建另一个版本的方法......
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2015-06-01
  • 2018-03-04
  • 1970-01-01
  • 2011-04-19
  • 2021-06-12
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多