【发布时间】: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