在 C library memcpy
的实现可能如下所示:
#include <stddef.h> /* size_t */
void *memcpy(void *dest, const void *src, size_t n)
{
char *dp = dest;
const char *sp = src;
while (n--)
*dp++ = *sp++;
return dest;
}
漂亮、干净并且与类型无关,对吗?但是当遵循内核教程时,原型(prototype)看起来像这样:
unsigned char *memcpy(unsigned char *dest, const unsigned char *src, int count);
我尝试像这样实现它:
{
unsigned char *dp = dest;
unsigned const char *sp = src;
while (count--)
*dp++ = *sp++;
return dest;
}
但我非常警惕到处都会看到 unsigned char
以及由于强制转换而可能产生的令人讨厌的错误。
- 我是否应该尽可能使用
uint8_t
和其他变体来代替unsigned TYPE
? - 有时我会看到
unsigned char *
而不是const char*
。这应该被视为一个错误吗?
最佳答案
您在 memcpy
的 C 库实现中看到了什么,它确认了 C 编程标准,即 C 编程标准如何定义 memcpy
接口(interface)。你在内核教程中看到的内容完全取决于教程作者,他如何设计他的内核和代码。 AFAIU,为了展示如何编写内核以及如何粘合和构建内部组件,您可以避免过多考虑是否使用 uint8_t
还是 unsigned char
(这些需要根据您是否真的希望内核在一定级别上扩展来做出决定)它们是相同的,但有助于项目的可读性。
并且,关于第二点 - 如果您确实确信应该使用 const char * 而不是 unsigned char * ,那么可以修复它。但是,还要关注内核如何工作,内存/视频/外围设备如何设置初始化等。
关于c - 无符号字符困扰我的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698734/