现代C++中STL API的差异(当我在VS2017中将目标从x64切换到x86时)
Differences in STL API in Modern C++ (When I switch target, from x64 to x86, in VS2017)
(当我将平台从x64切换到x86时,VS2017)
我有这个简单的ReadTextFile(full_path)函数:
std::wstring CEngine::load_text_file(std::wstring &full_path)
{
std::wstring buffer = m_text_file_cache[full_path];
if (buffer.empty()) // Load file:
{
std::wifstream wif(full_path);
wif.seekg(0, std::ios::end);
buffer.resize(wif.tellg()); // On Debug/Release x86: Warning C4244: 'argument': conversion from 'std::streamoff' to 'const unsigned int', possible loss of data
wif.seekg(0);
wif.read(buffer.data() , buffer.size()); // On Debug/Release x86: Error C2664: 'std::basic_istream<wchar_t,std::char_traits<wchar_t>> &std::basic_istream<wchar_t,std::char_traits<wchar_t>>::read(_Elem *,std::streamsize)': cannot convert argument 1 from 'const wchar_t *' to 'wchar_t *'
m_text_file_cache[full_path] = buffer;
}
return buffer;
}
m_text_file_cache
只是一个 std::map 缓存,用于减少磁盘 I/O。忽略它。
当我编译到 x64(主轨道)时没有问题,但是当我编译到 x86(出于好奇)时,我在代码中用注释标记了 2 个问题:警告 C4244 和错误 C2664。
之所以出现警告,是因为即使您处于 x86 模式,仍假定文件(可能)大于 4GB,这意味着它们的大小类型为 64 位。 64 位整数将截断为 32 位整数,并显示编译器提供的警告。static_cast
unsigned int
修复。
导致此错误是因为您的 x86 配置可能未在 C++17 模式下编译,因此,data()
函数返回wchar_t const*
,而不是 C++17 返回wchar_t *
的行为。将编译器标志更改为在 C++17 模式下编译,您将不再需要强制转换。最好为"所有"配置设置标志,这样将来就不必手动更改两者。
此外,不要使用 C 样式强制转换来解决此问题,例如(wchar_t*)buffer.data()
,因为这可能会隐藏此问题,直到它在代码的后面部分爆炸。如果您被迫为此代码使用 pre-C++17,请首选const_cast
:
wif.read(const_cast<wchar*>(buffer.data()) , buffer.size());
(警告问题)
x86 上的警告似乎是由于 x86 与 x64 上的size_t
定义不同:">size_t(无符号__int64或无符号整数,具体取决于目标平台)">- MSDN。"size_t是 64 位 Windows 操作系统上的 64 位值">- MSDN。MSVC 确定返回类型tellg()
std::streamoff
(通常为long long
的类型定义)。
std::wstring :: resize (size_type n);
从标准的角度来看,这里讨论的定义size_t
。
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++A*算法并不总是在路径中具有目标节点
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 为测试目标创建具有不同源文件夹的文件
- 为x86而非x64编译时出错
- 使用源向量作为目标
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 为什么在 x64 中忽略__stdcall调用约定?
- 在 CMake 中为每个目标设置编译器/链接器标志
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 CMake 中对目标依赖项进行分组?
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 现代C++中STL API的差异(当我在VS2017中将目标从x64切换到x86时)
- 致命错误LNK1112:在 npm 安装期间,模块计算机类型'X86'与目标计算机类型'x64'冲突
- 致命错误LNK1112:通过 vcvarsall .bat x86 运行构建'X86'模块计算机类型'x64'与目标计算机类型冲突
- QtGui4.lib(QtGui4.dll):致命错误LNK1112:模块计算机类型"X86"与目标计算机类型"x64"冲突
- LNK1112:模块计算机类型"x64"与目标计算机类型"X86"冲突:Qt创建者
- msvcprtd.lib(MSVCP100D.dll):致命错误LNK1112:模块计算机类型"X86"与目标计算机类型"x64"冲突
- 致命错误LNK1112:2010 年模块计算机类型"X86"与目标计算机类型"X64"冲突
- 错误 LNK1112:模块计算机类型"x64"与目标计算机类型"X86"冲突