2014-10-16 163 views
0

今天我在處理數據結構的任務時遇到了一些我必須解決的錯誤,這些錯誤對我來說都是非常新的。例如,以下內容:C++編譯器之間的差異

struct Node 
{ 
    // data and stuff 

Node(const T& d = T{}, Node * const p = nullptr, 
    Node * const n = nullptr, unsigned int f = 0) 
    : data(d), prev(p), next(n), freq(f) {} 

    // other stuff 
}; 

這在Visual Studio中運行得非常好,但在g ++中卻沒有。即使Visual Studio要我使用nullptr,我也必須將nullptr更改爲0。

使用學校的編譯器另一起事件給我的以下消息:

warning: extended initializer lists only available with -std=c++0x 

所以很自然我繼續將此添加到我的makefile文件。

這讓我想知道,考慮到將來我會編寫更復雜的程序,我會多久看一次編譯器的簡單差異導致的錯誤? Visual Studio是否不能與舊版編譯器兼容?我可以更改設置嗎?只是尋找關於使用各種編譯器時應該注意的事情的一般知識。

+4

您應該通過添加'-std = C++ 11''開關告訴g ++您正在構建C++ 11代碼。 g ++將默認編譯(我認爲)在C++ 03模式下。 – 2014-10-16 18:37:35

+0

'nullptr'是一個C++ 11的東西,默認情況下,gcc不會在C++ 11中編譯,而VS的新版本可以。 – juanchopanza 2014-10-16 18:37:55

+0

「我多久會看到編譯器中簡單差異導致的錯誤」 - 如果您不瞭解C++標準版本和配置編譯器之間的區別,那麼經常會這樣。否則,並不經常。 「Visual Studio是不是與舊版編譯器兼容?」 - 這甚至沒有意義。 – 2014-10-16 18:39:49

回答

3

g++將默認在C++ 03模式下編譯,這是C++ 11之前的C++標準。要告訴g++您的代碼實際上是C++ 11代碼,您必須使用-std=c++11編譯器開關。例如:

g++ -std=c++11 -o test test.cc 
+0

啊,這是非常有用的知道!我想這是簡單的,我應該知道的。 – spanishgum 2014-10-16 18:44:57

+0

儘管@JamesKanze所說的是真的:如果檢查任務的人沒有使用C++ 11,那對你沒有任何幫助。你可能想問他們,如果有疑問,總是用C++ 03模式下的g ++編譯。用''-pedantic -Wall -Wextra -Werror''。 – 2014-10-16 18:47:10

+1

我幾分鐘前發送電子郵件以確保安全。我想我現在會堅持03。是的,我正在使用-pedantic -Wall。我還沒有遇到--Wextra-錯誤呢!我現在將閱讀他們。非常感謝。 – spanishgum 2014-10-16 19:05:56