【问题标题】:uint8_t is recognized as a data-type but u8 isn't. Why?uint8_t 被识别为数据类型,但 u8 不是。为什么?
【发布时间】:2017-02-08 14:00:43
【问题描述】:

我正在学习基于 The Linux Kernel Module Programming Guide 在 Raspbian Jessie 上创建内核模块

目前我在hello-5.c 部分。我尝试添加static u8 myByte = 'X';,但无法识别u8。然后我将u8 更改为uint8_t,这与AFAIK 相同,uint8_t 被识别为数据类型。

教程的旧版本here 声明为static u8 myByte = 'X';,所以我想在新的教程中重复使用它。

较早的教程包括这些:

#define MODULE
#define LINUX
#define __KERNEL__

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

虽然较新的教程包括这些;

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/stat.h>

我尝试过使用旧的,但是define 部分会产生错误,所以我使用了较新的教程。

那么,为什么在新版本中uint8_t 可以识别而u8 不能识别?

【问题讨论】:

  • 我担心这个问题超出了这个特定站点的范围,但在 Stackoverflow 或 Unix.stackexchange 上可能会做得更好。
  • 哦,这实际上回答了我的问题。谢谢你。 :)
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为、特定问题或错误以及重现它所需的最短代码 。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • @WidiWidiyanto 请参阅 this、this 并阅读 LDD3 的 chapter 11。你会在那里找到答案。
  • @Olaf 我想我已经解释得很清楚了。我想试试static u8 myByte = 'X';,但它只有在我使用static uint8_t myByte = 'X'时才能识别

标签: linux linux-kernel c raspbian kernel-module


【解决方案1】:

因为u8 不是标准类型,而uint8_t 是(在C99 和更高版本&lt;stdint.h&gt; 中的typedef'd)。如果你想使用u8,在你的代码中包含一个带有适当类型定义的标题,或者在你的代码中使用类型定义。

【讨论】:

  • 这不是完全正确的答案。虽然它确实是一种非标准类型,但它在 Linux 内核中被广泛使用。我想问题不在于类型本身,而在于它用作模块参数。在任何情况下,都没有提供代码来查看作者实际做了什么。
  • 我使用chapter-5.c中的代码。我想添加静态 u8 myByte='X' 就像在旧版本 here
  • @0andriy:答案是正确的。 u8 不是标准类型。它在内核中的使用是 C99 之前的遗留物,标准中没有固定宽度的类型。 Linux 内核没有设置标准与否。但是,对于内核,应该坚持使用这些保留,但对于其他新项目,应该使用标准类型。
  • 所以我最好使用标准格式 (uint8_t) 而不是 u8。非常感谢。 :)
  • @WidiWidiyanto,不。在内核中最好使用u8、u16等。如果将其导出到用户空间,则必须使用__u8、__u16 等。
猜你喜欢
  • 1970-01-01
  • 2020-05-25
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2021-02-01
相关资源
最近更新 更多