摆脱警告信息 - 正确的方法

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