2013-04-26 4 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 типов. для меня это похоже на то же самое.

некоторые из этих типов определены в 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; 
... 

я не нашел __u8, но я все еще могу использовать его, и он ведет себя как uint8_t.

есть ли разница в производительности или потреблении памяти?

спасибо за помощь :)

+7

Рассмотрите все, что связано с двумя соседними подчеркиваниями, для вас. –

+2

См. [Этот вопрос] (http://stackoverflow.com/q/228783/440558) о ведущих символах подчеркивания в идентификаторах. –

+0

'uint8_t' доступен в системах, где есть собственный тип с ровно восемью битами. Если такого типа нет, то 'uint8_t' не определен. Это не имеет никакого отношения к unix, linux, OS X и тому подобное. Это касается аппаратного обеспечения, на котором работает программа. –

ответ

12

uintn_t являются определения типов указаны * по C99 (в <stdint.h>) и C++ 11 (в <cstdint>) стандартов. Все новые компиляторы обеспечивают эти и appopriate определения легко получить для нескольких древних легко, поэтому для мобильности всегда использовать это.

__un - специфичные для Linux типизированные методы, предшествующие этим стандартам. Они не переносимы. Двойное подчеркивание используется для обозначения нестандартного определения.

* в течение 8, 16, 32 и 64, они должны быть определены, если компилятор имеет тип такого размера, могут быть определены дополнительные из них.

+0

'[u] int [8,16,32,64] _t' не требуются стандартом C99/C11 или C++ 11. Они являются необязательными 'typedef', если типы точной ширины доступны в системе. – rubenvb

+2

@ 0x90: А где они указаны? –

+2

@rubenvb: пояснение - в то время как целые числа точной ширины являются необязательными в общем случае, typedefs, соответствующие размерам 8, 16, 32 и 64, требуются C99 и C11, если платформа имеет эти целые типы (в представлении дополнений двух для подписанных вариантов). –