2013-04-26 30 views
7

uint8_t__u8の違いを説明できる人はいますか?__u8とuint8_tの違い

私はuint8_tがstdint.hで定義されていることを知っています。これらはすべてのUNIXシステムで利用できます。

/* Unsigned. */ 
typedef unsigned char  uint8_t; 
typedef unsigned short int uint16_t; 
... 

そして、私がそれらの認識可能なものを私が意図しているものを使用する場合。

今私は__u8__u16タイプを見つけました。その私は同じであるように見えます。

これらのタイプのいくつかは、私が__u8を見つけるdidntのが、私はまだそれを使用することができますし、それがuint8_tように振る舞うのlinux/types.hで

#ifdef __CHECKER__ 
#define __bitwise__ __attribute__((bitwise)) 
#else 
#define __bitwise__ 
#endif 
#ifdef __CHECK_ENDIAN__ 
#define __bitwise __bitwise__ 
#else 
#define __bitwise 
#endif 

typedef __u16 __bitwise __le16; 
typedef __u16 __bitwise __be16; 
typedef __u32 __bitwise __le32; 
... 

で定義されています。

パフォーマンスやメモリ消費に多少の違いはありますか?ヘルプ:)

+7

隣接する2つのアンダースコアの中には、あなたのために制限がないものを考えてください。 –

+2

識別子の先頭のアンダースコアについては、[この質問](http://stackoverflow.com/q/228783/440558)を参照してください。 –

+0

'uint8_t'は、正確に8ビットのネイティブタイプが存在するシステムで使用できます。そのような型がない場合、 'uint8_t'は定義されません。これはunix、linux、OS Xなどとは関係ありません。これは、プログラムが実行されているハードウェアに関するものです。 –

答えて

12

uintn_tため

感謝のtypedefは、標準(<cstdint>中)11(<stdint.h>中)C99によって*を指定してC++されています。すべての新しいコンパイラはこれらを提供し、適切な定義はいくつかの古代のものを簡単に得るのは簡単です。そのため、移植性は常にこれを使用します。

__unは、これらの規格に先立つLinux固有のtypedefです。彼らは移植性がありません。ダブルアンダースコアは、非標準的な定義を示すために使用されます。

* 8、16、32及び64の場合、彼らは、コンパイラは、その大きさの型を持つ場合を定義しなければならない、付加的なものを定義することができます。

+0

'[u] int [8,16,32,64] _t'は、C99/C11やC++ 11標準では必要ありません。正確な幅の型がシステム上で利用可能な場合は、オプションの 'typedef'です。 – rubenvb

+2

@ 0x90:そしてそれらはどこに指定されていますか? –

+2

@rubenvb:明確化 - 正確な幅の整数型は一般的にオプションですが、プラットフォームにこれらの整数型がある場合は、サイズが8,16,32、および64のtypedefがC99とC11で必要です(2の補数表現署名されたバリアントの場合)。 –

関連する問題