2013-08-31 63 views
3

我所經歷的一些代碼,碰到一段代碼,這是這樣的: -「(void)temp;」聲明的意思?

void func(int a) 
{ 
    int temp; 
     ... 
     .... 
    temp=a; 
    (void)temp; 
} 

什麼是臨時變量在這裏做?如果我使用-Wall選項編譯它,我也不會收到任何編譯錯誤或警告。請幫我理解這種代碼風格。 謝謝。

+1

在你發佈的實際代碼片段中,'(void)temp'看起來確實很奇怪。 – NPE

+0

NPE說什麼。在這種情況下,您確實希望編譯器提醒您,因此您可以刪除不必要的本地文件。 –

回答

0

欺騙編譯器:假裝使用temp,但實際上什麼都不做。

6

這意味着temp的值在其他情況下未被使用,並且優化編譯器會警告它(變量已設置但未使用),但通過包括(void)temp;,您(當前)無需編譯器的警告即可離開。該行不會生成代碼,也不會產生編譯器警告。

由於源代碼:

extern void func(int a); 
void func(int a) 
{ 
    int temp; 
    temp = a; 
    //(void)temp; 
} 

GCC 4.8.1在Mac OS X 10.8.4給出了代碼警告:

$ gcc -O3 -g -std=c11 -Wall -Wextra -c void.c 
void.c: In function ‘func’: 
void.c:4:8: warning: variable ‘temp’ set but not used [-Wunused-but-set-variable] 
    int temp; 
     ^
$ 

由於刪除註釋標記(所以(void)temp;是編譯),編譯不會生成警告。


這顯然是從一些較大的背景下蒸例如代碼(SSCCE(Short, Self-Contained, Correct Example) - !感謝你生產一個)。代碼出現的原因可能有很多(有效性或多或少)。通常情況下,這是因爲在分配給temp後會有條件編譯的代碼,它將使用分配的值。取而代之的是一個功能參數的分配,它通常會是一個函數調用的結果:

void func(int a) 
{ 
    int temp; 
    ... 
    temp = some_function(a); 
#if defined(SOMETHING_OR_OTHER) 
    ...do stuff with temp... 
#else 
    (void)temp; 
#endif 
} 

這個符號保持單一的函數調用,但避免了當沒有定義SOMETHING_OR_OTHER從編譯器的投訴。

+0

非常感謝您的解釋。 – ShreshthaB

+0

我試過gcc -O3 -g -Wall -Wextra -c void.c在我的Ubuntu機器上使用gcc版本(Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2但我沒有收到任何錯誤或警告。是的,你是對的。 temp會收集系統調用的返回值,即write()。但是func()本身沒有一個條件編譯。感謝指標雖然。我會在瀏覽代碼時記住這一點。 – ShreshthaB

+0

在GCC 4.6.0中添加了「設置但未使用」警告;它不在GCC 4.5.x中。我能夠測試4.5.1,4.5.2,4.6.0,4.7.0,4.7.1,4.8.1(我保留了它們的拷貝 - 但4.4.2實例是缺失的,缺少一個庫)。 –

0

它評估表達式temp(一個簡單但仍然有效的表達式)並告訴編譯器通過將表達式的結果轉換爲void(表示「no type」)來丟棄該表達式的結果。

相關問題