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

时间:2017-11-14 12:55:57

标签: c++ visual-studio-2015 oracle-pro-c

我正在研究遗留的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多个地方。有没有办法摆脱这个警告消息可能正在使用某种宏? 请建议。

由于

2 个答案:

答案 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