C: 将字节数组声明为 uint8_t 有什么问题吗?
C: Is there something wrong with declaring byte arrays as uint8_t?
我正在开发一个使用字节数组的小型网络应用程序。传统上,这些将用 char buf[] = ...
.
之类的东西声明
这似乎是大多数教程中(仍然?)完成的方式,但它存在的问题是它可能会掩盖实际发生的事情,例如,当您尝试打印这样的数组时却忘记了并非每个char是可见字符。
有些人 have suggested 您应该完全停止使用 chars
,而是使用现代的 uint8_t
。我发现这非常有吸引力,主要是基于显式优于隐式的原则。
那么,将这些类型的数组声明为 uint8_t buf[] = ...
有什么问题吗?
从C99中引入stdint.h
header开始,没有很好的理由继续使用char
类型来表示小数。
除了更好地记录您的意图之外,uint8_t
还为您提供了一个更重要的优势:它保证字节将被视为无符号。当您使用 char
时,您不能假设它是有符号的还是无符号的,因为这种行为是 implementation-defined.
就缓冲区的无意打印而言,使用 uint8_t
并不能保证任何保护,因为在许多平台上它只是 unsigned char
的 typedef
。
我正在开发一个使用字节数组的小型网络应用程序。传统上,这些将用 char buf[] = ...
.
这似乎是大多数教程中(仍然?)完成的方式,但它存在的问题是它可能会掩盖实际发生的事情,例如,当您尝试打印这样的数组时却忘记了并非每个char是可见字符。
有些人 have suggested 您应该完全停止使用 chars
,而是使用现代的 uint8_t
。我发现这非常有吸引力,主要是基于显式优于隐式的原则。
那么,将这些类型的数组声明为 uint8_t buf[] = ...
有什么问题吗?
从C99中引入stdint.h
header开始,没有很好的理由继续使用char
类型来表示小数。
除了更好地记录您的意图之外,uint8_t
还为您提供了一个更重要的优势:它保证字节将被视为无符号。当您使用 char
时,您不能假设它是有符号的还是无符号的,因为这种行为是 implementation-defined.
就缓冲区的无意打印而言,使用 uint8_t
并不能保证任何保护,因为在许多平台上它只是 unsigned char
的 typedef
。