【问题标题】:Initialize QByteArray avoiding [-Wnarrowing]初始化 QByteArray 避免 [-Wnarrowing]
【发布时间】:2018-02-17 11:08:43
【问题描述】:

我在一个架构上,默认情况下char 被解释为signed。

我构造了一个类似于Qt5 documentation for QByteArray 中提到的char array:

const char char_buffer[] = {
    0xFF, 0x00, 0x03
}; 

当我后来分别调用QByteArray::fromRawData(char_buffer)QByteArray(char_buffer)时,编译器会报错:

error: narrowing conversion of ‘255’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]

(fromRawData() 没有 unsigned char * 参数重载)

解决方案:

每当我必须与其中一个内置函数进行交互时,我都会发送unsigned char *。

const char uchar_buffer[] = {
    0xFF, 0x00, 0x03
}; 
QByteArray::fromRawData(reinterpret_cast<const char*>(uchar_buffer), sizeof(uchar_buffer))

问题:

我是否监督了任何更简单/直接的解决方案而无需强制转换(并保持缩小警告)?

【问题讨论】:

  • 声明数组为 unsigned char 并在与 qt 交互时强制转换?
  • @AndreiAndrey 我这样做了(现在用更简单的铸造更新了问题)。你能想到如何避免强制转换吗?

标签: c++ qt casting char


【解决方案1】:

每当与期望 char * 的 Qt 函数交互时强制转换 unsigned char * 的解决方案是可以的。

铸造的替代方法

使用编译器标志-funsigned-char 使编译器默认使用unsigned char。

使用 .pro:

QMAKE_CXXFLAGS += -funsigned-char

使用 CMake:

set( CMAKE_CXX_FLAGS "-funsigned-char")

正确的解决方案

最初的问题是char_buffer 是如何初始化的。 Integer literals(例如 0xFF)来自整数类型。最好首先使用character literals,例如,

const char char_buffer[] = {
    '\xFF', '\x00', '\x03'
};

【讨论】:

  • 初始化char 数组时使用字符文字。我认为原始代码在这方面很臭(这就是警告的内容)。
  • @Darklighter 我同意,但这正是 Alternative 1 的意义所在。
  • 我知道,我只是想表明我的观点,它不是真正的替代方案,而是正确的方式™。
  • 好的,找到@Darklighter。就我而言,我根据提供的示例编写代码,并且宁愿避免现在到处更改为 char 文字。无论如何,我同意并将改变答案,尽管这些字符文字看起来真的很丑。
猜你喜欢
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多