簡體   English   中英

如何避免“無法訪問代碼中的動態初始化”警告?

[英]How can I avoid the “dynamic initialization in unreachable code” warning?

我正在編寫類似於以下內容的模板化函數*

template <typename T, bool v> 
void foo(T t1) {
    /* common code */
    if (v) {
        int i = bar();
        /* ... */
        return;
    }
    else {
        /* ... */
    }
    /* more common code */
}

當我對此進行編譯並且foo實例化且v設置為false時,編譯器會說:

warning: dynamic initialization in unreachable code

現在,由於template參數,代碼無法訪問; 這應該是完全可以接受的。 如何避免或禁止此警告? 我寧願不完全壓制這種警告。

筆記:

  • 我寧願不對true和false進行專門化處理,因為有一些通用代碼,而且我不想重復,也不想人為地創建另一個函數。
  • 實際上,它是由NVCC編譯的CUDA內核。 如果您可以更一般地回答問題,請這樣做,否則專門針對這種情況回答。

對於當前的構造,沒有一種真正已知的簡單修復方法(我也遇到了同樣的問題,NVCC也是如此)。 但是,您可以將v=true的模板專門化,僅將代碼插入if(v) -statement內。

這絕不是最佳解決方案,因為它可能導致代碼重復,但可以解決警告。

如果您使用GCC作為主機編譯器,並且錯誤出在主機代碼中,那么您也可以嘗試像這樣抑制警告:

#pragma GCC diagnostic ignored "-Wunreachable-code"

編輯:只是注意到這可能是錯誤的警告代碼,因為它通常是關於無效代碼的。 完整的警告列表可在以下位置找到: http : //gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

這個問題可能也很有趣: 如何使用nvcc禁用編譯器警告

暫無
暫無

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

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