簡體   English   中英

如何在C ++編譯期間剝離調試代碼?

[英]How to strip debug code during compile time in C++?

假設我有一個C ++函數debugPrint(int foo)。 我怎樣才能最方便地從發布版本中刪除它? 我不想用#ifdefs包圍每次調試debugPrint,因為它真的很耗時。 另一方面,我想100%確定編譯器剝離了對該函數的所有調用,以及函數本身來自發布版本。 如果使用函數調用產生的參數調用它,也應該發生剝離。 例如,debugPrint(getFoo());. 在這種情況下,我也希望剝離getFoo()調用。 我理解函數內聯可能是一種選擇,但不保證支持內聯。

使用conditinal編譯和宏:

#ifdef _DEBUG
   #define LOG( x ) debugPrint( x )
#else
   #define LOG( x )
#endif

為調試版本定義_DEBUG ,而不是為發布版本定義它。 現在發布版本

LOG( blahbhahblah );

將被擴展為空字符串 - 即使參數也不會被評估,也不會包含在發出的代碼中。

您可以使用在調試版本中定義但未在發行版中定義的任何現有預處理器符號,而不是_DEBUG

使函數內聯,函數內部有#ifdef,如下所示:

inline void debugPrint(whatever_t wtvr)
{
    #ifdef DEBUG
        Logger::log(wtvr);
    #endif
}

這樣,優化器將在保持代碼清潔的同時剝離空函數。

@ sharptooth的答案很好。 一個微小的變化,我通常做,但是,如果要禁用調試NDEBUG沒有定義,而不是如果調試定義:

#ifndef NDEBUG
   #define LOG( x ) debugPrint( x )
#else
   #define LOG( x )
#endif

當定義了NDEBUG宏時,那么C assert ,我傾向於使用相當寬松的方式來斷言諸如前置條件和后置條件之類的東西,甚至幫助澄清復雜邏輯的結果,也退出編譯。 它是“無調試”的標准宏。 並且, NDEBUG宏應該已經在發布版本中定義。

請參閱: http//www.opengroup.org/onlinepubs/009695399/functions/assert.html

我之前使用預處理器做過類似的事情。

#ifndef DEBUG
#define debugPrint
#endif

基本上,這將刪除所有調試行


#ifdef _DEBUG
#define debugPrint(x) _debugPrint(x)
void _debugPrint(int foo) {
    // debugPrint implementation
}
#else
#define debugPrint(x)
#endif

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM