【问题标题】:Getting rid of the warning message - the proper way摆脱警告信息 - 正确的方法
【发布时间】:2017-11-14 12:55:56
【问题描述】:

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

谢谢

【问题讨论】:

  • @NJMR 如果您可以将数据成员 stmt.len 重新声明为 size_t 类型。:)
  • 更改len成员的类型?
  • (char*)stmt.arr 这样的 C 风格转换通常表明你做错了。
  • @VladfromMoscow:VARCHAR 是专业的* C/C++ 数据类型。我无法修改它。

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


【解决方案1】:

你可以关闭警告

#pragma warning( disable : 4267)

尽管就我个人而言,我会解决错误并正确修复。您对static_cast 的想法不错,并且在您使用unsigned 类型时不会出现溢出的未定义行为的危险。

最后,请注意,使用宏替换标准库函数是未定义的行为。不要那样做。

【讨论】:

【解决方案2】:

这是始终如一地使用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

【讨论】:

  • 不,谢谢。我还看到你的回答比我快得多:D
  • @oetoni:所以我添加了这个。 #define strlen(x) static_cast(strlen((char *)x))。如果我错了,请纠正我。
  • 你真的不应该用#define 做一个宏。正如@Barthsheba 所说,这不是针对您的场景定义/记录的解决方案,而是您的选择……如果您选择这样做,那么您在宏定义上是正确的。这样就行了。我正在添加代码示例并测试我的答案
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多