私のプログラムは、バイナリデータをファイルに書き込んで、特定の非テキストファイル形式に準拠させるという共通の作業を行います。私が書いているデータはすでに存在するチャンクにはないので、実行時にバイト単位でまとめられているので、write()
の代わりにstd::ostream::put()
を使用します。私はこれが通常の手順であると仮定します。バイナリファイル出力でコンパイラの警告C4309 - "定数値の切り捨て"を避けるための正統な方法はありますか?
プログラムは正常に動作します。これは、引数として2桁の16進数を持つstd::stringstream::put()
とstd::ofstream::put()
の両方を使用します。しかし、コンパイラの警告C4309:put()
への引数が0x7fより大きいときはいつでも(VC++ 2010で)「一定値の切り捨て」が得られます。明らかにコンパイラはsigned char
を期待しており、定数は範囲外です。しかし、私は切り捨てが実際に起こっているとは思わない。バイトは、それが想定されているように書かれます。
コンパイラの警告は私が普通の、受け入れられた方法で物事をやっていないと私に思います。私が説明した状況は、共通のものでなければなりません。 このようなコンパイラの警告を回避する一般的な方法はありますか?または、これは無視する必要がある無意味なコンパイラ警告の例ですか?
私はそれを避けるために2つの控えめな方法を考えました。すべての呼び出しでmystream.put(char(0xa4))
のような構文を使用できます。またはstd::stringstream
の代わりにstd::basic_stringstream< unsigned char >
を使用することができますが、そのトリックはstd::ofstream
で動作するとは思われません。テンプレートタイプではありません。 ofstream
はバイナリファイルの作成を目的としているため、ここではより良い解決策が必要なようです。
あなたの考えは?
--EDIT--
ああ、私はstd::ofstream
テンプレートタイプないことに関する間違っていました。実際にはstd::basic_ofstream<char>
ですが、その方法を試してみましたが、定義されたメソッドがなく、多態性の非互換性がstd::ostream
ではうまくいかないことに気付きました。
ここでのサンプルコードです:
stringstream ss;
int a, b;
/* Do stuff */
ss.put(0);
ss.put(0x90 | a); // oddly, no warning here...
ss.put(b); // ...or here
ss.put(0xa4); // C4309
具体的なコード例をあなたの質問に追加できますか? –
私は、コンパイラライターが "無意味な"警告を生成する時間を持っていないと確信しています。 –