2017-09-08 15 views
0

私はアーキテクチャ上でcharがデフォルトでsignedと解釈されています。 Qt5 documentation for QByteArrayで述べたようにQByteArrayを初期化する[-Warrowing]を避ける

私は似た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] 

(のためのunsigned char *パラメータのオーバーロードはありませんfromRawData()

ソルut:

組み込み関数の1つと対話する必要があるときはいつでも、私はunsigned char *をキャストします。

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

質問:

私はキャスト(及び狭小化のための警告を維持)することなく、任意のより簡単/まっすぐソリューションを監督しましたか?

+0

配列を符号なしの文字として宣言し、qtと相互作用するときにキャストしますか?たとえば、character literalsを使用することをお勧めします。 –

+0

@AndreiAndrey私はこれをしました(質問は、より簡単なキャスティングで更新しました)。キャスティングを避ける方法について考えてみませんか? – Marcus

答えて

1

char *を予期しているQt関数と対話するたびに、unsigned char *をキャストするソリューションは問題ありません。

デフォルトでは、コンパイラの使用unsigned charを作るためのコンパイラフラグ-funsigned-charを使用し

をキャストに代わります。 .PROで

:CMakeのでは

QMAKE_CXXFLAGS += -funsigned-char 

set(CMAKE_CXX_FLAGS "-funsigned-char") 

適切な解決策

初期問題がchar_bufferが初期化される方法です。 Integer literals(例:0xFF)は整数型からのものです。

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

'char'配列を初期化するときにcharリテラルを使用します。私は元のコードがその点で匂いがするものと考えています(これは警告です)。 – Darklighter

+0

@Darklighter私は同意しますが、それはまさにAlternative 1 **のことです。 – Marcus

+0

私はちょうどそれが正しい方法ではなく、正しい方法であると私の意見を述べたいと思っています。 – Darklighter

関連する問題