2014-03-27 87 views
4

我正在寫一個模板函數*類似以下內容:如何避免「無法訪問的代碼中的動態初始化」警告?

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 

現在,由於模板參數,代碼無法訪問;這應該是完全可以接受的。我怎樣才能避免或抑制這個警告?我寧願不完全壓制這種警告。

注:

  • 我寧願不擅長不同的真假,因爲有一些共同的代碼,我不想重複,也不是人爲地創造另一個功能。
  • 實際上它是由NVCC編譯的CUDA內核。如果你能更普遍地回答這個問題,請做,否則專門回答這個案件。
+0

你可以專門爲'v'。 – RedX

+1

我擔心,你的測試用例不能反映實際問題 –

+0

@pmr這是真的,但我經常在CUDA代碼中看到類似這樣的代碼。這樣,與使用函數參數相比,器件代碼可以更好地優化,從而導致更少的代碼和更少的寄存器使用,同時仍避免重複的代碼。 – anderas

回答

4

隨着目前的建設,沒有簡單的方法來真正解決它,我知道(我有同樣的問題,也與NVCC)。但是,您可以專門使用v=true的模板,並僅在該專業化中將代碼插入if(v)-陳述中。

這絕不是一個最佳解決方案,因爲它可能導致代碼重複,但會修復警告。

如果您正在使用GCC作爲主機編譯器和錯誤是在主機代碼,你也可以嘗試抑制這樣的警告:

#pragma GCC diagnostic ignored "-Wunreachable-code" 

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

這個問題也可能會感興趣:How to disable compiler warnings with nvcc

+0

這個pragma的範圍是什麼?我如何關閉它?另外,我調整了我的示例,以便使v = true專用化更加合理。 – einpoklum

+1

範圍是「直到編譯單元結束」。要保存/恢復當前狀態,請分別使用'#pragma GCC診斷推送'和'#pragma GCC診斷流行'。 – anderas