簡體   English   中英

由於條件宏,Clang / GCC禁用未使用的代碼警告

[英]Clang/GCC disable unused code warning as a result of conditional macro

我正在編寫一個程序,其中包含可以通過宏禁用的調試代碼DEBUG 設置為1 ,應將調試代碼編譯為二進制文件,設置為0 ,不應將調試代碼編譯為二進制文件。

我正在編譯-Wunreachable-code enabled,我的問題來自編譯代碼,例如:

if (DEBUG) {
    printf("debug string!\n");
}

啟用調試時,這將編譯正常,因為條件將始終計算為1(true)。 但是,當禁用調試( DEBUG=0 )時,我在第二行的printf調用上收到無法訪問的代碼警告。 我知道這可以通過#ifdef/#endif預處理程序指令來解決,但是如果可以避免的話,我不喜歡用預處理程序指令填充程序體。

我想知道是否有任何方法可以在不使用診斷編譯指示的情況下將代碼保留為c樣式條件( #pragma GCC diagnostic )。 任何幫助將不勝感激,謝謝!

您可以使用pre-proccessor條件而不是運行時條件:

#if DEBUG == 1
  printf("debug string!\n");
#endif

因此,完整的調試代碼被“消除”而不留下“空”代碼塊。 這比讓生產中的任何調試代碼更加清晰,這些調試代碼在更改的條件下可能會表現不同並影響其余代碼。

或者,如果由於某種原因您不能使用預處理器條件,則可以引入logtrace功能,通常在單獨的翻譯單元中。 然后你可以對其中的DEBUEG -state作出反應。 您甚至可以提供兩個庫實現,一個用於生產的“空”和一個用於deubug的“工作”實現,並配置您的構建以選擇正確的實現。

但是 - 如上所述 - 即使調用“空”函數也可能影響編譯時優化或運行時行為。 所以我真的建議采用預處理器的方式。

我只是在clang上發出警告(如果-Wunreachable-code打開),而不是gcc。 開關使警告靜音。 或者,編譯指示也可以(如果您只反對編譯指示,則可以使用_Pragma關鍵字)。

#include <stdio.h>
#define DEBUG 0
int main()
{
#if 1
    switch(!!DEBUG){
    case 1: puts("hello world");
    case 0:;
    }
#else
    _Pragma("gcc diagnostic push(\"-Wno-unreachable_code\")")
    if(DEBUG){
        puts("hello world");
    }
    _Pragma("gcc diagnostic pop")
#endif

}

暫無
暫無

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

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