Container include order making a difference with VS140 toolset 但不是 VS120

Container include order making a difference with VS140 toolset but not not VS120

我有一个 VS 解决方案(包含许多项目),它使用 Visual Studio 使用 VS120(Visual studio 2013)工具集构建查找。

现在我想开始使用一些库,这些库利用了 VS120 工具集未完全实现的一些 C++11 功能,因此现在似乎是切换到 VS140 的好时机。

但是当我这样做的时候,我突然在编译 std 库容器时遇到了一些错误(实际上是 6478 个错误)。

我做了一些调查,注释掉了代码,到目前为止我发现如果我编译一个特定的源文件,编译到

时就会出错
#include <queue>

现在上面的行出现了几个includes,在其他一些include之后。

如果然后在我的源文件的开头放入完全相同的行,在任何其他包含之前,它构建没有错误。

所以似乎在另一个 headers 中设置或更改了某些东西,这导致了问题...但仅限于 VS140 工具,而不是 VS120

在我进一步深入兔子洞试图找出造成这种情况的原因之前,我想知道是否有人知道它可能是什么?

编辑:

对不起,我忘了post错误的例子。

Severity    Code    Description Project File    Line    Suppression State
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    166 
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    424 
Error   C2334   unexpected token(s) preceding '{'; skipping apparent function body  GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    167 
Error   C2334   unexpected token(s) preceding '{'; skipping apparent function body  GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    426 
Error   C2206   'swap': typedef cannot be used for function definition  GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    180 
Error   C2206   'swap': typedef cannot be used for function definition  GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    442 
Error   C2091   function returns function   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    74  
Error   C2091   function returns function   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    103 
Error   C2091   function returns function   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    166 
Error   C2091   function returns function   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    333 
Error   C2091   function returns function   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    376 
Error   C2091   function returns function   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    424 
Error   C2065   '_Left': undeclared identifier  GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    180 
Error   C2065   '_Right': undeclared identifier GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    180 
Error   C2065   '_Left': undeclared identifier  GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    442 
Error   C2065   '_Right': undeclared identifier GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    442 
Error   C2061   syntax error: identifier 'value'    GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    74  
Error   C2061   syntax error: identifier 'value'    GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    102 
Error   C2061   syntax error: identifier 'value'    GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    333 
Error   C2061   syntax error: identifier 'value'    GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    374 
Error   C2061   syntax error: identifier '_Swap_adl'    GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    424 
Error   C2059   syntax error: '('   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    166 
Error   C2059   syntax error: ')'   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    166 
Error   C2059   syntax error: '{'   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    167 
Error   C2059   syntax error: '('   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    424 
Error   C2059   syntax error: ')'   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    424 
Error   C2059   syntax error: '{'   GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue    426 

最可能的原因是 #include <queue> 之前的 header 之一中的宏重新定义了 <queue> header 使用的内容。

例如如果你有:

#include "some_project_header.h"
#include <queue>

some_project_header.h包含:

#define emplace 1
// ...

然后它会完全破坏 <queue> header 的编译,因为当编译器看到 std::queue::emplace 成员函数时它会说 1 而不是 [=19] =]例如

template<class T, class Container = deque<T>>
class queue {
  // ...
  template <class... Args>
  reference 1(Args&&... args)
    { return c.emplace_back(std::forward<Args>(args)...); }

如果 VS120 还没有实现 std::queue::emplace 成员(这是在 C++11 中添加的),那么它就不会有那个问题。

如果我的猜测是正确的,那么您 header 中的某些内容正在使用不应该使用的名称,并且需要修复。

一个快速解决方法是将 #include <queue> 移动到文件的顶部,这样它就包含在另一个 header 的问题之前,但这并不能真正解决问题,只是隐藏它。