2

重複の可能性:
C ++マクロを再定義してから、定義し直すことはできますか?

アプリの存続期間中にサードパーティのSDKから関数を何度も呼び出すアプリケーションがあります。このサードパーティ関数は、その_3RDPARTY_ASSERT(_ASSERTのラッパー)でいくつかのエラーをチェックします。

私の問題は、これらの呼び出しの1つで、エラーが発生することがある(そして後で処理する)ことです。この場合、デバッグ中に非常に煩わしいため、アサートを無効にしますが、他のすべての場合はそのままにしておきます。

プラグマ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;
}
4

2 に答える 2

2

ここでの問題は、インライン化されていない限り、関数がトークン化されて1回コンパイルされることです。つまり、関数を呼び出すときにマクロが定義されているかどうかは関係なく、関数自体をコンパイルしているときだけです。

于 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

私が好む2番目の解決策は、これです。サードパーティのコードにアクセスできる場合は、_3rdParty(...)アサートされない別のバージョンを作成し、必要に応じて使用できます。

于 2012-12-04T10:08:45.807 に答える