2012-12-04 40 views
2

可能重複:
Can I redefine a C++ macro then define it back?我可以禁用內部函數中的宏嗎?

我有一個調用從第三方SDK大量的一起應用生命期的功能的應用。這個第三方函數用_3RDPARTY_ASSERT(這是_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

@Jon:這不是重複的。這個問題是關於一般情況,用一個相對簡單的解決方案,這是關於一個沒有明顯解決方案的特定情況。 – raven

+0

你是對的,對不起。 – Jon

+0

已關閉?人們不知道如何閱讀? – raven

回答

2

這裏的問題是,除非它被內聯,函數將被標記並編譯一次。這意味着,只有在編譯函數本身時,是否在調用函數時定義宏並不重要。

+0

我知道...我希望有某種解決方法:) – raven

+0

既然你想改變如何定義函數,但只在一個特定的調用,我真的不知道如何。抱歉。 是否沒有其他方式可以先處理,然後保存錯誤信息以便以後處理? – Agentlien

+0

我不這麼認爲。我可以使用完全相同的代碼添加_3rdParty_NoAssert(),但沒有聲明。不過,我試圖避免這種情況。 – raven

1

如果你有機會獲得的_3RDPARTY_ASSER定義,就像

#define _3RDPARTY_ASSERT definition 

然後保存該定義:

#define SAVE_ASSERT definition 

然後在發生在你的代碼,當你不想要一個說法你可以#undef _3RDPARTY_ASSERT#define它到別的東西。

代碼後,你可以重新啓用

#define _3RDPARTY_ASSERT SAVE_ASSERT 

的第二個解決方案,我喜歡舊的定義是這樣的:如果你有機會獲得3'd第三方代碼,您可以創建另一個版本_3rdParty(...)它不會斷言,然後根據需要使用它。

+1

除了他想在一個調用中禁用它,而不是在宏指定本身的地方,所以在那個時候重新定義宏將沒有什麼區別。然而,你的第二個解決方案似乎是合理的 – Agentlien

+0

謝謝!正如Agentlien所說,第一部分對我的具體問題沒有用處。我擔心我將不得不創建另一個版本的方法... – raven

相關問題