2014-10-16 121 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