2017-03-05 72 views
-3

我這裏一些代碼,提出了一個警告警告:即使用「返回0」,控制也會達到非void函數的結束[-Wreturn-type]在主功能

控制到達非void函數[-Wreturn型]結束。

讓我困惑的是,如果我在功能打印機中添加return 0;,警告消失。我是C語言的新生,所以希望你能幫助我解決這個問題。謝謝。

#include <stdio.h> 

int printer(int *ip){ 
    printf("%d", *ip); 
// return 0; //with the expression, the warning will disappear. why? 
} 

int main(int argc, char *argv[]){ 
    int number = 10; 
    int *ip; 
    ip = &number; 

    printer(ip); 
    return 0; 
} 
+1

那麼,你是怎麼聲明'printer'函數返回的,你實際返回了什麼? – kaylum

+0

或將'printer'的返回類型從'int'更改爲'void'。 – BLUEPIXY

+1

這不是魔術。無論你聲明你的函數返回「type」是什麼,你都應該返回那個'type'的值,例如。 'void foo(){..不返回任何東西,但可以返回;}}; 'int foo(){..返回一個int; ..}'; 'char * foo(){..返回一個char *; ..}' - 你得到了漂移。 –

回答

2

編譯器打印的printer()的警告,因爲它不能假定該函數將永遠不會從其他函數調用比main()和它的返回值被意外使用。

要解決此問題,您必須放棄編寫此類危險代碼:通過return語句返回一些值或聲明返回值的類型爲void

3

您聲明打印機函數返回一個整數。

int printer(... 

但您不返回整數。 我認爲你需要使它

void printer(... 

,以便它沒有return語句在函數

1
int printer(int *ip){ 
    printf("%d", *ip); 
// return 0; //with the expression, the warning will disappear. why? 
} 

該函數返回int類型的值工作,因爲它是在指定的它的頭:在開始發言

int printer(int *ip) 

int意味着該函數應該返回值調用它的函數。這意味着調用函數需要從printer()得到一個值。

如果你有一個返回值爲空,然後調用函數不會對返回值,因此做這樣的事情:

int num = AnyFunction(); 

哪裏AnyFunction()是返回void,或者沒有一個實例功能,將導致錯誤。但是,如果AnyFunction()返回值int,那麼上面的語句有效,這是您的情況。現在,如果你的函數不返回任何東西,即使它應該,那麼什麼值將被存儲在num

因此,編譯器給你一個警告,因爲你的代碼中可能不會使用printer()函數的返回值,因此不需要返回語句。但是,如果您嘗試使用上述語句,那麼您的函數將不會返回任何內容,這會導致問題。在你的情況下,你不使用返回值printer(),所以你的代碼不會遇到問題。


要刪除錯誤,要麼你可以這樣做:

return 0; // You did this, and you noticed that this resolved the issue 

這消除了問題,因爲你返回一個0值(我們按照慣例使用0,糾正我請,如果我錯了,在這)只是爲了同名。就像我說的那樣,返回值根本不被使用,因此警告已解決。

另外,您還可以在函數頭更改爲:

void printer(int *ip) { 

這消除了警告,因爲現在,你的函數返回void類型的值,這不算什麼。在你的情況下,這是更好的,因爲你不使用第一個選擇中的語句返回的值0。

相關問題