2011-02-05 18 views
0

在C#中,我們可以做一個方法像這樣:我怎樣才能讓C++中的調試功能,如ConditionalAttribute在C#

[Conditional("DEBUG")] 
private void MyFunction() 
{ 
} 

在發行,此方法將不再是「存在」。我有一個類,我想在每個方法的開始執行相同的斷言,所以我想把這組斷言放在他們自己的方法中。如果我選擇這樣做,我是否會依賴編譯器優化出一個空函數(因爲assert會被優化)?例如:

class MyClass 
{ 
private: 
    void DebugFunction() 
    { 
     assert(...); 
     assert(...); 
     assert(...); 
     // ... 
    } 
}; 

或將我引入一個宏:

#ifdef NDEBUG 
#define DebugFunction 
#endif 

什麼是做到這一點的最好方法是什麼?

+0

我相信你想在那裏有#ifndef NDEBUG ... – JaredC 2011-02-05 03:36:45

回答

3

編譯器肯定會優化空函數。我希望asserts的功能優於不同版本的用於調試和發佈的代碼。當然,你應該適當命名的功能,並記錄你的理由,以及:-)

如果由於某種原因,你絕對沒有必須使用#ifndef的衝動,一定要做到這一點CheckState()功能。這樣,您可以在發佈模式下執行檢查,稍後您應該做出決定。例如:

class MyClass 
{ 
private: 
    void CheckState() 
    { 
     assert(...); 
     assert(...); 

#ifndef NDEBUG 
     // some expensive check to only run on Debug builds 
#endif 

     // Some check you want to always make 
    } 
}