【问题标题】:VC++: Code works in VS2010 and breaks in VS2013VC++:代码在 VS2010 中工作,在 VS2013 中中断
【发布时间】:2014-10-07 09:50:43
【问题描述】:

编辑:与投票结束时提到的问题不同,这里的违规代码是 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 文件 (x86)\microsoft visual studio 12.0\vc\include\xlocnum(1105):错误 C2491:'std::numpunct<_elem>::id':不允许定义 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?

【问题讨论】:

  • 我以前来过这里...确保您拥有所有标题#includeed。 VS2010 自动 #include 标头,但是 VS2013 不这样做。
  • (1) VS2010/2013 使用相同的设备来解析包含(使用不同的 CRT 头文件夹),(2) 错误本身不是“未定义符号”/“缺少类型说明符”等. 家庭,所以 - 这不太可能是标题包含问题。
  • 我没有投票关闭它,请不要侮辱。
  • 抱歉,感谢您抽出宝贵时间尝试和帮助。这些下意识的投票/近距离投票对我来说真的很烦人。

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


【解决方案1】:

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

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

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

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

也许这有帮助?

【讨论】:

  • 我刚才看到我的原始评论没有出现 - 谢谢,这或多或少是我最终使用的解决方案。我没有更改包含顺序,而是在包含 dbgint 后立即#undef'd _CRTBLD。
猜你喜欢
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多