我正在研究遗留的pro * C / C ++代码,并将项目迁移到Visual Studio 2015.当我在VS中编译代码时,它在100多个地方给我一个以下警告消息。
warning C4267: '=': conversion from 'size_t' to 'unsigned short', possible loss of data
,相应的代码是
stmt.len = strlen((char*)stmt.arr); // VARCHAR stmt[500];
我打算将上面的代码更改为
stmt.len = static_cast<unsigned short>(strlen((char *)stmt.arr));
这只会删除警告消息。但我必须修改100多个地方。有没有办法摆脱这个警告消息可能正在使用某种宏? 请建议。
由于
答案 0 :(得分:3)
您可以使用
关闭警告#pragma warning( disable : 4267)
虽然,就个人而言,我会解决错误并正确修复。您对static_cast
的想法并不错,并且当您使用unsigned
类型时,不存在溢出未定义行为的危险。
最后,请注意,使用宏替换标准库函数是未定义的行为。不要那样做。
答案 1 :(得分:1)
这是始终如一地使用#pragma warning (disable : 4267)
的正确方法。或者,你做了一个铸造,但你作为更新。
解决C4267警告以及如何禁用它们也建议here:
#include <iostream>
#include <string.h>
#define strlen(x) static_cast<unsigned short>(strlen((char *)x))
//I tested with ((char *)x+1) and ((char *)x+2) for variation
using namespace std;
int main() {
char stmt[] = "something";
int len = strlen((char*)stmt); // VARCHAR stmt[500];
cout << len;
return 0;
}
对于宏#define(仅一个样本)
{{1}}
使用IDEONE
测试here