__u8和uint8_t之间的区别

baa*_*aam 9 c++ types stdint

有人可以解释各类型之间的差异uint8_t__u8

我知道这uint8_t是在stdint.h中定义的,并且它们在每个unix系统上都可用.

/* Unsigned.  */
typedef unsigned char       uint8_t;
typedef unsigned short int  uint16_t;
...
Run Code Online (Sandbox Code Playgroud)

如果我使用它们可以识别我打算做什么.

现在我偶然发现了__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;
...
Run Code Online (Sandbox Code Playgroud)

我没找到,__u8但我仍然可以使用它,它的行为就像uint8_t.

性能或内存消耗有一些差异吗?

感谢帮助 :)

Jan*_*dec 17

uintn_t是指定的typedef *通过C99(在<stdint.h>)和C++ 11(在<cstdint>)的标准.所有新编译器都提供这些,并且很容易为少数古代编译器提供合适的定义,因此为了便携性,请始终使用它.

__un特定于Linux的typedef早于这些标准.它们不便携.双下划线用于表示非标准定义.

*对于8,16,32和64,如果编译器具有该大小的类型,则应定义它们,可以定义其他类型.

  • @ 0x90:他们在哪里指定? (3认同)
  • @rubenvb:澄清 - 虽然精确宽度整数类型通常是可选的,但是如果平台具有那些整数类型,则C99和C11需要对应于大小8,16,32和64的typedef(以2的补码表示形式)已签名的变种). (2认同)