Edited at

あなたの型宣言、モダンですか?


はじめに

はプログラミングをやる上で必ず学ぶ基本的なシステムのひとつです。特にCやC++のような静的型付け言語では変数を定義するときに型を指定しなければならないので、まず最初に学ぶことになります。

「そんなんわかってるわ!初心者向けの説明かよ!」と思われる熟練者の方もいるかも知れませんが、あなたの型宣言はきちんとモダンなものになっていますか?


stdint使ってますか?

突然ですが、int型が何バイトかあなたは即答できますか?

4バイトと答えられたあなたは勉強熱心です。じゃあlongは?charは?unsigned longは?

「そんなん8バイト、1バイト、8バイトに決まってるやんけ!」というみなさん、すごいです。私のようなぼんくらは覚えてられません。しかし今後16バイトや32バイトの整数型が必要になったらどうするんですか?unsigned long long intみたいな型を作るんですか?まあそれはジョークですが...。ジョークのようですがC99ではすでに準備されているそうです。やばい。

ともかく、これらの型名は古くからあるものですが、可読性がよくありません。charという名前にはどこにもそれが1バイトのシーケンスを表すという意味はありません。

それに、システムによってintなどの型の長さが変わる場合があります。RATLONALEの節を見てください。

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html#tag_13_19_06

16bitシステムではint型は16bit(2バイト)ですが、32bitでは32bit(4バイト)です。これは致命的です。

そこでモダンなC/C++には、統一的な命名ができるようstdint.hという型システムが用意されています。

サイズ
符号あり
符号なし

8
int8_t
uint8_t

16
int16_t
uint16_t

32
int32_t
uint32_t

64
int64_t
uint64_t

unsigned int は長すぎて打つのに疲れます。uint32_t のほうがしゅっとしてて的確なのでわかりやすいですね。


やむを得ずintやcharを使う場合


レガシーなライブラリがintやcharを要求する場合。

名前しかちがわないので、キャストしてやりましょう。

//結局危険

int32_t nnn
legacy_func((int)nnn)


よくわからないこと


  • 同じgccでも、stdint.hをインクルードしなくても使えるときと、しないとエラーになることがあります。なぜでしょう。


参考サイト