c - 无符号字符困扰我的代码

标签 c kernel

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 以及由于强制转换而可能产生的令人讨厌的错误。

  1. 我是否应该尽可能使用 uint8_t 和其他变体来代替 unsigned TYPE
  2. 有时我会看到 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/

相关文章:

C中计算字符串中特定子字符串的数量

c - 使用 ANSI 函数获取文本文件的特定行

memory-management - 烧录到闪存的​​特定扇区

linux - 插入 USB HID 设备时防止 usbhid 自动加载

debugging - Linux 内核的线程感知 gdb

c++ - 为什么编译器允许字符串文字不是 const?

c - 如何在 C 中使用 Asterisk 操作

linux - "mmap"在 linux 内核的哪个位置查看文件 inode 以查看它是否已经加载?

C++:如何检查输入是否只是一个 int?

linux - ASLR 实现