1 #include "stdio.h"
2
3 int num =0;
4 int value =7;
5
6 int TestFunc(void)
7 {
8 if(num ==0)
9 return
10 value += 1;
11 return5;
12 }
13
14 int main(void)
15 {
16 PRintf("%d/n",TestFunc());
17 return0;
18 }
上面這段代碼的第9行應該是一個錯誤,但是編譯器其實什么都查不出來,而是把第10行的計算結果作為了最終的返回值。程序編譯運行后如下:GreydeMac-mini:exp02 greyzhang$ gcc exp02.c
GreydeMac-mini:exp02 greyzhang$ ./a.out
8
在C語言中,return后面可以什么參數都不加,這種用法一般是用在返回值為void的函數中。返回值不為void出現什么都不加的return會出現問題嗎?我測試了一下,其實這個還真不好說,跟具體的環境有一定的關系。上面的程序修改如下:
1 #include "stdio.h"
2
3 int num =0;
4 int value =7;
5
6 int TestFunc(void)
7 {
8 if(num ==0)
9 return;
10 value += 1;
11 return5;
12 }
13
14 int main(void)
15 {
16 printf("%d/n",TestFunc());
17 return0;
18 }
Mac中程序編譯運行:
GreydeMac-mini:exp02 greyzhang$ gcc exp02.c
exp02.c:9:2: error:non-void function 'TestFunc' should return a value
[-Wreturn-type]
return;
^
1 error generated.
由上面的信息看來,這是個錯誤,而且幸運地被被編譯器找到了。不過,Windows下面的測試確實是不同,我目前手頭沒有Windows的環境,只能把之前下班后在公司的電腦中做的測試簡單描述下。
測試1:Windows7下使用gcc 3.4.2進行測試,輸出結果一直為16384,我不知道為什么會這樣,但是懷疑是不是跟Windows的版本號有一定關系?然而,查了軟件授權服務版本之后發現這個猜想似乎又不對。公司中的軟件版是否是正版我不是很清楚,懶得去查了,畢竟在公司是否使用正版軟件上我確實是無能無力。
測試2:Windows7的另一臺電腦,使用gcc 4.9.2測試,返回結果為0。這個結果又是讓我一陣子糊涂,到底是什么機制呢?難不成gcc在比較新的版本中對此軟件特性進行了升級?在公司的電腦中軟件安裝很不自由,在同一臺電腦上測試兩個版本的gcc不可能,具體是不是又OS的因素我不好下定論。
看了上面的幾個結果,綜合對比下,我個人覺得Mac中內置的編譯器LLVM做的應該是最好的處理。這種錯誤的隱患或者說是不確定的隱患,應該在編譯階段給出錯誤,至少也應該給出警告。
新聞熱點
疑難解答