2017-04-03 55 views
0

爲什麼下面的代碼在g ++編譯器上完美工作,但是在Visual Studio IDE上出錯?爲什麼main()在g ++編譯器中編譯,而不是在Visual Studio IDE中編譯

#include<iostream> 
using namespace std; 
main() 
{ 
    cout <<"this is a test"<< 
    return 0; 
} 

在Visual Studio中,我必須要改變的代碼如下:

#include<iostream> 
using namespace std; 
int main() 
{ 
    cout <<"this is a test"<< 
    return 0; 
} 
+0

你看到g ++的消息嗎?你使用什麼版本?建議使用其他參數運行它,例如'g ++ -Wall -Wextra -Wpedantic -WeffC++ -Werror -std = C++ 11'(或C++ 14) –

+0

Alsi儘量避免在你的代碼中刪除整個正確的galdf你複製並粘貼。 –

+0

我沒有看到C++的消息,我認爲版本是5-4.0,當我在IDE上運行時,我得到錯誤「missing type specifier -int」 – JKJ

回答

1

GCC編譯器的缺省配置以允許非標準功能(保留與錯誤代碼的「向後兼容性」錯誤)泄漏到C甚至C++代碼中而臭名昭着。

如果你喜歡寫在標準C或C++語言代碼,請務必使用這樣的編譯器設置爲-pedantic,或者更好,-pedantic-errors以及相應的-std=...設置。這些選項並不完美,但它們會使編譯器捕捉大部分基本錯誤。

+0

與不具有_any_非標準功能的VC++相比,如將非常量引用綁定到臨時對象;-) –

1

的第一個程序是無效的C++,但是因爲這種風格函數定義的(沒有明確的返回類型)曾經是在C中很常見,爲了向後兼容,g ++可以讓你在默認情況下避開它。 Visual Studio不會這樣做。

如果你想G ++保持嚴格符合編碼標準(你應該),使用

g++ -pedantic -std=c++11 (or -std=c++14) 

這應該標記你的程序有一個警告信息爲無效。僅僅使用-std=c++xx是不夠的。始終使用這兩個選項。

它也建議,使各種附加的警告信息,例如:

g++ -Wall -Wextra -Weffc++ 

-WeffC++可以給你誤報,請在評論中討論

警告不應該被忽略,但如果您希望編譯器強制執行此操作,則以下推薦選項會將所有警告視爲錯誤:

g++ -Werror 
+0

'-WeffC++'基於Effective C++的第一版,所以對現代C++代碼沒有用處。我不推薦使用它。 –

+0

@JonathanWakely來自-WeffC++集的特定警告對現代代碼沒有用處?我想不出任何。 –

+0

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55837 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16166 https://gcc.gnu.org/bugzilla /show_bug.cgi?id=16168 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77984(如果有人修復它可能會很好,但在此之前它是無益的) –