2013-04-26 10 views
7

uint8_t__u8 유형의 차이점을 설명 할 수 있습니까?__u8과 uint8_t의 차이

uint8_t은 stdint.h에 정의되어 있으며 모든 유닉스 시스템에서 사용할 수 있다는 것을 알고 있습니다.

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

그리고 내가 사용하고자하는 의도대로 알아볼 수 있습니다.

이제는 __u8__u16 유형을 발견했습니다. 그게 나를 위해 같다.

그 형식 중 일부

은/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을 찾을 didnt는 리눅스에 정의되어 있지만, 난 여전히 사용할 수 있으며 uint8_t처럼 동작합니다.

성능이나 메모리 소비에 약간의 차이가 있습니까? 도움을

감사합니다 :)

+7

두 개의 인접한 밑줄이 포함 된 것을 고려해보십시오. –

+2

식별자의 밑줄에 대한 정보는 [이 질문 (http://stackoverflow.com/q/228783/440558)을 참조하십시오. –

+0

'uint8_t'는 정확히 8 비트의 네이티브 타입이있는 시스템에서 사용할 수 있습니다. 그러한 유형이 없으면'uint8_t'가 정의되지 않습니다. 이것은 유닉스, 리눅스, OS X와는 아무 상관이 없다. 프로그램이 실행되는 하드웨어에 관한 것입니다. –

답변

12

uintn_t는 형식 정의가 (<stdint.h>에서) C99에 의해 *을 지정 기준 (<cstdint>에서) C++ (11)이다. 모든 새로운 컴파일러는 이러한 것들을 제공합니다. 적절한 정의는 몇 가지 오래된 것들을 쉽게 얻을 수 있기 때문에 이식성은 항상 이것을 사용합니다.

__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의 보수 표현 서명 된 변형의 경우). –