C++ C4244:'+=';:从';std::streamsize';至';尺寸';,数据可能丢失
我已将我的VC++项目从VS2008迁移到VS2013,并收到一些警告,如:C++ C4244:'+=';:从';std::streamsize';至';尺寸';,数据可能丢失,c++,visual-c++,visual-studio-2013,C++,Visual C++,Visual Studio 2013,我已将我的VC++项目从VS2008迁移到VS2013,并收到一些警告,如: C4244:“+=”:从“std::streamsize”转换为“size\t”,可能会丢失数据。 如何解决这些类型的警告?如中所述,std::streamsize被定义为签名的(重点): 类型std::streamsize是一种有符号整数类型,用于表示在I/O操作中传输的字符数或I/O缓冲区的大小。它用作std::size\u t的签名副本,类似于POSIX类型ssize\u t 无论如何,似乎没有具体说明具体的实现
C4244:“+=”:从“std::streamsize”转换为“size\t”,可能会丢失数据。
如何解决这些类型的警告?如中所述,std::streamsize
被定义为签名的
(重点):
类型std::streamsize
是一种有符号整数类型,用于表示在I/O操作中传输的字符数或I/O缓冲区的大小。它用作std::size\u t
的签名副本,类似于POSIX类型ssize\u t
无论如何,似乎没有具体说明具体的实现
通常,从有符号
到无符号
类型(例如long
)的转换不应发出有关可能数据丢失的警告(除非使用符号指示器)
这可能是Visual StudioC++中的一个很差的实现。
< P>在MSVC 2013中,代码> STD::StRealStase:typedef _Longlong streamsize;
typedef _LONGLONG _Longlong;
#define _LONGLONG __int64
typedef unsigned __int64 size_t;
而size\u t
是:
typedef _Longlong streamsize;
typedef _LONGLONG _Longlong;
#define _LONGLONG __int64
typedef unsigned __int64 size_t;
因此,一个简单的重新编程案例是:
unsigned __int64 b = 1;
__int64 a = b;
但是,这不会发出警告-所以您可能将大小\u t
重新定义为32位
为清楚起见:
std::streamsize b = 1;
size_t a = 0;
b = a;
也不会发出警告。这取决于使用情况。根据, 除了在std::streambuf的构造函数中,std::streamsize的负值从未使用过 因此,您可以安全地强制转换签名值
std::streamsize i;
// ...
尺寸=静态铸件(i);
然而,在更一般的情况下(与πάντα相反ῥεῖ 我认为这个警告是有效的(即使gcc
没有给出类似的警告)。比较有符号值和无符号值时,最好明确您的意思
您可以强制无符号,例如,使用以下代码段(感谢的常规形式):
#包括
模板
typename std::enable_如果::type
强制未签名(TU){
if(u<0){
throw std::overflow_error(“不能将负值用作无符号类型”);
}
返回static_cast(u);
}
模板
typename标准::如果<,则启用!std::is_signed::value,T>::type
强制未签名(TU){
返回u;
}
int main(){
St::CUT可能不重复@ RKMYHODORIGKING。关于代码>未签名int=(int)-1;< />代码>什么?您希望代码> U>代码>吗?您会考虑这个数据丢失吗?编译器应该发出警告吗?