VC ++:代码在VS2010中工作,在VS2013中断

时间:2014-10-07 09:50:43

标签: visual-c++ visual-studio-2013 msvcrt

编辑:与投票结束时提到的问题中的案例不同,这里的违规代码是CRT代码,不是我的。即使它有问题(我很确定它没有),我也无法修复其来源。


我们有一些传统的内存泄漏跟踪代码,它使用了一些CRT内部结构(没什么太奇特的,基本上是_CrtMemBlockHeader,它是sort-of documented)。在尝试从VS2010迁移到VS2013时,代码似乎会导致零星的构建失败,并且违规部分可以简化为:

#include <windows.h>

#define _CRTBLD
#include <..\crt\src\dbgint.h>

#include <fstream>
void Func()
{
    std::ofstream myfile;
    myfile << 8;
}

即,这些10行单独在VS2010和VS2013中构建得很好:

  

c:\ program files(x86)\ microsoft visual studio   12.0 \ vc \ include \ xlocnum(1105):错误C2491:&#39; std :: numpunct&lt; _Elem&gt; :: id&#39; :不允许定义dllimport静态数据成员

我怀疑错误信息不准确 - 确实有几种可能的id定义,在1105行都没有。还有相当多的警告:

1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(1105): warning C4273: 'id' : inconsistent dll linkage
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(80) : see previous definition of 'public: static std::locale::id std::numpunct<char>::id'
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(80) : while compiling class template static data member 'std::locale::id std::numpunct<_Elem>::id'
1>          with
1>          [
1>              _Elem=char
1>          ]
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(1185) : see reference to function template instantiation 'const _Facet &std::use_facet<std::numpunct<_Elem>>(const std::locale &)' being compiled
1>          with
1>          [
1>              _Facet=std::numpunct<char>
1>  ,            _Elem=char
1>          ]
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum(1179) : while compiling class template member function 'std::ostreambuf_iterator<char,std::char_traits<char>> std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char>>>::do_put(_OutIt,std::ios_base &,_Elem,std::_Bool) const'
1>          with
1>          [
1>              _OutIt=std::ostreambuf_iterator<char,std::char_traits<char>>
1>  ,            _Elem=char
1>          ]
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream(306) : see reference to class template instantiation 'std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char>>>' being compiled
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream(292) : while compiling class template member function 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(int)'
1>          c:\users\ofek\documents\visual studio 2013\projects\testcamsys2013\testcamsys2013\source.cpp(10) : see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(int)' being compiled
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\fstream(921) : see reference to class template instantiation 'std::basic_ostream<char,std::char_traits<char>>' being compiled
1>          c:\users\ofek\documents\visual studio 2013\projects\testcamsys2013\testcamsys2013\source.cpp(9) : see reference to class template instantiation 'std::basic_ofstream<char,std::char_traits<char>>' being compiled

现在我将_CrtMemBlockHeader的定义及其周围的一些宏直接粘贴到我的代码中。但是仍然 - 有人能看到什么破了吗?

我意识到它并不完全支持,但人们可以希望:是否有更强大的方法来使用_CrtMemBlockHeader?

1 个答案:

答案 0 :(得分:2)

在我的系统上查看此错误,它似乎只与#define _CRTBLDfstream标头相关。包含的dbgint.h无关紧要(您可以注释掉#include并仍然会收到同样的错误。

所以,这似乎是fstream标题中的一个问题。更改包含顺序会删除编译错误:

#include <windows.h>
#include <fstream>

#define _CRTBLD
#include <..\crt\src\dbgint.h>

也许这有帮助?