摆脱警告信息 - 正确的方法
Getting rid of the warning message - the proper way
我正在处理遗留的 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多个地方。有什么方法可以消除此警告消息可能正在使用某种宏?
请提出建议。
谢谢
您可以使用
关闭警告
#pragma warning( disable : 4267)
尽管就个人而言,我会解决错误并正确修复。您对 static_cast
的想法不错,并且当您使用 unsigned
类型时,不存在溢出的未定义行为的危险。
最后,请注意使用宏替换标准库函数是未定义的行为。不要那样做。
坚持使用size_t
才是正确的方法。或者,您可以进行转换作为更新。
C4267 警告的解决方法以及如何禁用它们也建议 here 是:
#pragma warning (disable : 4267)
对于宏#define(仅示例)
#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;
}
使用 IDEONE
测试 here
我正在处理遗留的 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多个地方。有什么方法可以消除此警告消息可能正在使用某种宏? 请提出建议。
谢谢
您可以使用
关闭警告#pragma warning( disable : 4267)
尽管就个人而言,我会解决错误并正确修复。您对 static_cast
的想法不错,并且当您使用 unsigned
类型时,不存在溢出的未定义行为的危险。
最后,请注意使用宏替换标准库函数是未定义的行为。不要那样做。
坚持使用size_t
才是正确的方法。或者,您可以进行转换作为更新。
C4267 警告的解决方法以及如何禁用它们也建议 here 是:
#pragma warning (disable : 4267)
对于宏#define(仅示例)
#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;
}
使用 IDEONE
测试 here