2012-08-12 123 views
2

我犯了一個錯誤調用函數'。我花了很多時間來理解爲什麼編譯器會忽略我的功能。爲什麼在編譯期間沒有報告?編譯器構建一切都沒有錯誤,但tere沒有「2」的消息框。編譯器不報告錯誤代碼

#include "stdafx.h" 
#include <windows.h> 

void tstB() 
{ 
MessageBox(NULL, "2", NULL, NULL); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
MessageBox(NULL, "1", NULL, NULL); 
tstB; 
return 0; 
} 
+1

優化器*喜歡*這樣的表達式。嘗試'42;'同樣的想法,不同的類型。否則,經典的C語法,任何表達式都可以通過把一個語句變成一個語句;分號結尾。 – 2012-08-12 21:28:32

回答

5

,因爲它是一個有效的表達式這是不是一個錯誤。表達式的結果是一個函數指針。您可以使用表達式如下:

void (*p)() = tstB; 
2

你需要調用它像這樣:

tstB(); 

否則,你只是有一個指向函數的指針,這是不是一個錯誤。

與合適的編譯標誌,GCC產生warning: statement has no effect [-Wunused-value]

3

沒有任何關於使用tstB;作爲一種表達,這是一個有效的語句是非法的。它類似於

int main() { 
    int a; 
    a; 
}