t_byte*
(typedef unsigned char t_byte
)またはunsigned char*
のようなコードをコード内に表示したいですか?ベストプラクティス:CまたはC++でbyte型のtypedefを作成する必要がありますか?
私は自分自身のライブラリでt_byte
に向かっていますが、このアプローチがとられた大きなプロジェクトでは一度も働いたことがなく、落とし穴について疑問に思っています。
t_byte*
(typedef unsigned char t_byte
)またはunsigned char*
のようなコードをコード内に表示したいですか?ベストプラクティス:CまたはC++でbyte型のtypedefを作成する必要がありますか?
私は自分自身のライブラリでt_byte
に向かっていますが、このアプローチがとられた大きなプロジェクトでは一度も働いたことがなく、落とし穴について疑問に思っています。
C99以降を使用している場合は、stdint.h
を使用してください。 uint8_t
(この場合は)。
C++ 11までは、このヘッダは取得されませんでした。このヘッダは、cstdint
と呼ばれていました。古いバージョンのVisual C++では、C99のstdint.h
をC++コードで使用することはできませんでしたが、その他のC++ 98コンパイラはほとんどすべてのコンパイラが使用していました。非常に多くの他のものと同じように
、boost/integer.hpp
の違いを超えるBoost論文、コンパイラの標準C++ライブラリがない場合uint8_t
のようなものを提供します。
個人的には、私はとboost::uint8_t
が好きです。
ブーストを使用したくない場合は、boost\cstdint.hpp
を借りることができます。
もう1つの選択肢は、portable version of stdint.h
(this回答からのリンク)です。
あなたの厄介な命名規則に加えて、私は大丈夫かもしれないと思います。クロスプラットフォームの能力を支援するために、あなたのためにこれを行い、心ブーストしてください:通常タイプのがbyte_t
のように、_t
接尾辞いる
#include <boost/integer.hpp>
typedef boost::uint8_t byte_t;
注意。
uint8_tを追加することで既存のコードが壊れないように、言語や標準ライブラリの拡張用に予約されているため、定義する型に "_t"を付けることは避けてください。 – Dipstick
@chrisharrisこの情報はどこにありますか?私はISO C++ Standardsのドラフトを見ていますが、そのセクションを見つけることはできませんが、彼のクラス/ファンクションのテンプレートに接尾辞を付けて、彼に指摘したいと思っている同僚がいます。 – stinky472
@ stinky472:ISO C規格がこれについて何を言っているのか分かりませんが、常識的にはカスタム名は標準のものと衝突しないようにするので、問題を避けるためには 'byte'を使う方が良いです。あるいは、あなたの同僚が好むなら、接尾辞の代わりに*プレフィックス*を使用してください: 't_byte'。 – MestreLion
は、私はあなたのコンパイラがサポートしている場合、それは、このようなuint8_t
とint8_t
としてC99<stdint.h>
ヘッダタイプを使用することを示唆しています。
コンパイラでサポートされていない場合は、作成してください。 Here'sの例VC++、それ以前のバージョンにはstdint.h
がありません。 GCCはstdint.h
をサポートし、あなたがタイプのエイリアスを作成しませんので、もしchar
の符号は、実装定義されていることであるあなたの提案とC99
一つの問題の実際に最もありません。あなたは少なくともサインについて明白でなければなりません。 のC#には、たとえばchar
が16ビットなので、アイデアにはいくつかメリットがあります。しかし、それはバイトタイプも持っています。あなたの提案には問題はありませんでした
追加のノート...
、あなたは実際には符号なしの指定でした。
データが実際に文字データである場合、つまりコンソールに表示されるようなプレーンテキストの表現である場合は、プレーンchar
が使用されることをお勧めします。これにより、標準ライブラリとサードパーティのライブラリを使用する際の型式合意の問題が少なくなります。一方、データがビットマップなどの文字以外のエンティティを表す場合、または算術演算を実行する数値「小整数」データまたは論理演算を実行するデータである場合は、 stdint.h
タイプ(またはそれらのうちの1つから定義されたタイプ)を使用する必要があります。
あなたがbyte
タイプを定義するためにそれを使用している場合でも、stdint.h可能性を使用することがより望ましい理由があるので、私は最近、char
は、実際の16ビットであるTI C54xxコンパイラに出巻き込まれましたunsigned char
が適切なエイリアスであると仮定します。
私の例については、ウォーレンの答えが正しいとマークしました。彼は最初であり、彼の投稿は簡潔でした。あなたを少なくともアップアップしました... –
私は、標準の型unsigned char、uint8_tなどを使用することをお勧めします。ソースを見ているプログラマは、コードを書くためにヘッダを参照する必要はありません。より多くのtypedefを使用するほど、他の人があなたの入力規則を知るのにかかる時間が長くなります。構造体では、絶対にtypedefを使用しますが、プリミティブではそれを控えめに使用します。
私は、型がその中に格納されている値の意味を伝えることを好みます。私のマシン上にバイトを記述するタイプが必要な場合は、unsigned char
よりもbyte_t
が好きです。 (私はsigned char
またはunsigned char
のいずれかを使用してUTF-8文字列を格納するコードベースで作業しています)。同じことがuint8_t
になります。それはちょうどそのように使うことができます:8ビットの符号なし整数。
byte_t
(他の適切な名前のタイプと同様)で定義されているものを参照する必要はほとんどありません(もしそうなら、良いエディタが3秒かかるでしょう;たぶん10秒、コードベースが巨大な場合)、それを見るだけで、そのタイプのオブジェクトに何が格納されているかがわかります。
私はtypedefsのためだけにboostヘッダーを必要としています。 –
stdint.hはC99で定義されていますが、現行のISO C++標準では(現在のISO C++標準では)が必要でないため、一部のコンパイラではヘッダ名にC規約を使用する必要がありますそれは最も移植性の高いフォームになります。 –
Clifford