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 chartypedef