禁用MSVC++2010中的警告
Disable warning in MSVC++2010
我有以下代码:
/** Stupidly copies unicode chars into normal chars. */
std::string wstring2string(__in const std::wstring& s)
{
std::string temp(s.length(), ' ');
#pragma warning(push)
#pragma warning(disable: 4244) // possible loss of data
std::copy(s.begin(), s.end(), temp.begin());
#pragma warning(pop)
return temp;
}
我的编译器仍然显示警告C4244:
1>c:program filesmicrosoft visual studio 10.0vcincludexutility(2144): warning C4244: '=': Konvertierung von 'const wchar_t' in 'char', möglicher Datenverlust
1> c:program filesmicrosoft visual studio 10.0vcincludexutility(2165): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)".
(英文:"将const wchar_t
转换为char
,可能会丢失数据,请参阅刚刚编译的函数模板的实例化参考…")。
如何禁用它?!
为了消除此警告,您需要在包含函数的头文件周围添加#pragma warning...
。在你的情况下,这是徐蒂性。它包含在多个其他文件中。所以很难找到。但是你可以这样试试。
#pragma warning(push)
#pragma warning(disable: 4244) // possible loss of data
#include <xutility>
#pragma warning(pop)
Your includes go here...
std::string wstring2string(__in const std::wstring& s)
{
std::string temp(s.length(), ' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
除此之外,我建议进行正确的转换。例如,看看ICU,或者至少使用标准的功能。例如mbstopcs
当我想这样做时,我只需将#pragma warning(disable,2422)放在有问题的.cpp文件的顶部,在#include之后。但如果我是你,我会尽力解决这个警告,而不是把它掩盖起来。去掉constness可能会导致未定义的行为。
要解决警告,请尝试以下操作(我们在解决方案中使用此功能):
string wtoString( const wchar_t *ws ){
size_t bufferSize = (wcslen(ws) + 1) * sizeof(wchar_t);
char * buffer = new char[ bufferSize ];
size_t convertedChars;
wcstombs_s( &convertedChars, buffer, bufferSize, ws, _TRUNCATE);
string result(buffer);
delete[] buffer;
return result;
}
将其适配为接收常量wstring&,考虑到当您为wstring()调用c_str()时,您会得到一个常量wchar_t*,这应该很容易
EDIT:现在我再看一遍,如果将RAII用于缓冲区局部变量,它可以得到进一步改进。以防万一。
EDIT:更正代码以考虑字符大小
试着把你的函数改成这样(没有C++编译器可以检查它是否编译):
std::string wstring2string(__in const std::wstring& s)
{
size_t bufferSize;
// first call to wcstombs_s to get the target buffer size
wcstombs_s(&bufferSize, NULL, 0, ws.c_str(), ws.size());
// create target buffer with required size
char* buffer = new char[bufferSize];
// second call to do the actual conversion
wcstombs_s(&bufferSize, s.c_str(), bufferSize, ws.c_str(), ws.size());
string result(buffer, bufferSize);
delete[] buffer;
return result;
}
(受dario_ramos答案启发)
当你在Windows上时,你甚至可以使用Windows API函数WideCharToMultiByte,它基本上做同样的事情,但允许你指定目标编码。
只有在包含字符串h-file之前禁用了警告,才会显示警告。想想这种行为的原因,我想这是模板特有的问题。当包含模板类时,编译器会进行某种预编译。只有当模板被实例化时,才能完成完整的编译。看起来VC++编译器从预编译阶段就保留了警告设置,在实例化之前更改它们并没有帮助。
- MSVC 2010 编译应用程序和 MSVC 2019 编译应用程序之间的行为差异
- 是MSVC 2010中的错误还是我做错了什么
- 将MinGW64.o链接到MSVC 2010
- 使用 CMAKE 和 MSVC 2010 构建 GDCM 2.4.1 无法获取所有 DLL
- MSVC 2010项目范围的带参数宏
- 将mingw64 lib与MSVC 2010联系起来
- 在 MSVC 2010 中编译 64 位应用程序
- __declspec(dllimport)导致MSVC 2010上的编译器崩溃
- 在MSVC 2010上使用bjam构建Boost 1.50时出错
- MSVC 2010 and UTF8
- 如何使用 MSVC++ 2010 使 dll 更小
- 类崩溃编译器中的 MSVC 2010 模板化映射
- 似乎找不到 std::thread 在 msvc ++ 2010 Express
- msvc 2010应用程序0xc000007b错误
- MSVC++2010 Express链接器错误LNK2005
- 用于MSVC++2010编译器的调试器
- 无法解决 Qt/C++/NMake 的链接器错误 - 未使用选项 '/LIBPATH:' 指定参数 (Qt 5.2.0/MSVC 2010)
- BOOST_STATIC_ASSERT on MSVC++ 2010
- 部分模板专门化在msvc++ 2010与默认值
- 禁用MSVC++2010中的警告