2017-04-12 134 views
1

由於是從爪哇島正在添加,我wounder爲什麼編譯犯規的類似警告約可達代碼:爲什麼我可以用2個返回來編譯代碼?

int main(int argc, char** argV) 
{ 

    std::list<int> lst = {1,2,3,4}; 

    return 0; 



    std::cout << "Done!!!" << std::endl; 
    return 0; 
} 

我的問題:

爲什麼我編譯2個返回代碼?

我的編譯器是C++ 11,在Windows上,代碼塊

+1

你能想到你不應該能夠的原因嗎? –

+1

'爲什麼編譯器不警告'並且您的警告級別設置是...? – deviantfan

回答

5

我wounder爲什麼編譯器警告犯規像

在一些關於不可達代碼,它在GCC documentaion很好解釋有關的警告:

-Wunreachable碼

如果編譯器檢測到代碼永遠不會被執行,則發出警告。此選項旨在警告編譯器檢測到 至少會有一整行源代碼將永遠不會執行,因爲某些條件永遠不會得到滿足或者因爲它在永不返回的過程之後會發出警告。

有可能使該選項產生警告,即使有 是哪些情況下刪除明顯執行不到 代碼時,受影響的產品線的一部分可以 執行,所以應小心。

例如,當函數內聯時,警告可能意味着 行僅在一個內聯函數副本中不可訪問。

此選項,因爲在程序的調試版本 不進行-Wall的一部分,經常有大量的代碼,檢查程序的正確 運作,是,希望訪問,因爲 程序做的工作。不可達代碼的另一個常見用途是 提供可在編譯時選擇的行爲。

儘管啓用此選項g ++ 5.1.0不會爲此代碼產生任何警告。

0

GCC因爲這部分

std::cout << "Done!!!" << std::endl; 
return 0; 

將永遠不會被調用,因爲第一return聲明的,但它是不是一個錯誤中止編譯,而編譯器可能會放棄警告,這取決於你使用的是什麼編譯器(例如,Microsofts VC++編譯器就此提醒你)。

0

主要是因爲編譯器通常無法確定。 (在Java中已經嘗試這樣做,但是已經決定了用於定義可達性的標準。)

在這種情況下,確實很明顯。

某些編譯器會發出可達性警告,但C++標準不要求這樣做。

的可達性沒有答案是不完整的引用這樣的:https://en.wikipedia.org/wiki/Halting_problem

由於在Java中的最後一句話,考慮這兩個Java代碼片段:

if (true){ 
    return; 
} 
; // this statement is defined to be reachable 

while (true){ 
    return; 
} 
; // this statement is defined to be unreachable 

最糟糕的根據我的拙見,這兩個世界都是可以實現的。

+0

相關:Java常常警告*,因爲像所說的100%正確性是不可能的。不僅用於可達性的事情,而且還用於代碼路徑之類的事情,而不需要初始化等。 – deviantfan

0

無法訪問的代碼在C++中不是編譯錯誤,但通常會給出警告,具體取決於您的編譯器和標誌。

當您調用編譯器時,您可以嘗試添加-Wall選項。這會對 激活很多有用的警告。

+0

- 檢查牆! –

+0

它需要-Wunreachable-code不包括在-Wall – Slava

0

有兩個原因:

  1. C++有許多標準(C++ 11,C++ 14,C++ 17等)與Java(Java是在標準非常剛性的,並且只有對於Java來說真正重要的是你使用的版本),所以,一些編譯器可能會警告你關於無法訪問的代碼,而另一些則可能不會。

  2. return 0之後的語句雖然在邏輯上無法訪問,但不會導致任何致命錯誤,如歧義,語法錯誤等,並且可以輕鬆編譯(如果編譯器要;))。

+0

'C++有許多標準(C++ 11,C++ 14,C++ 17等)不像java'不像Java。 Java語言也有版本,這不等於軟件版本。 – deviantfan

1

爲什麼你不能編譯具有多個返回值的代碼? 因爲代碼無法訪問?大多數編譯器可以爲此發出警告。

不過,我經常看到這樣的代碼:

if(a) 
    { 
     // Do stuff 
    } 
    else 
    { 
     // Do other stuff 

     if(b) 
     { 
      // Do more stuff 
     } 
     else 
     { 
      // Do other more stuff 
     } 
    } 

可能被簡化爲

if(a) 
    { 
     // Do stuff 
     return; 
    } 

    // Do other stuff 

    if(b) 
    { 
     // Do more stuff 
     return; 
    } 

    // Do other more stuff 

大約十年前,人們不贊成具有方法的功能不止一個回報,但實際上沒有理由繼續用現代編譯器對它進行皺眉。

相關問題