linux/list.h 中container_of 宏背后的基本原理

2023-12-28

在linux内核列表中的实现/include/linux/list.h,第一行(粘贴在下面)背后的基本原理是什么container_of macro?

const typeof( ((type *)0)->member ) *__mptr = (ptr);

在我的示例代码中,我删除了这一行并将定义更改为

#define container_of(ptr, type, member) ({                      \
     (type *)( (char *)ptr - offsetof(type,member) );})

我的代码仍然显示了预期的结果。那么第一行是多余的吗?还是其中隐藏着一些我不知道的陷阱?

我在以下位置找到的代码常见问题解答/链接列表 http://kernelnewbies.org/FAQ/LinkedLists

/**
 * container_of - cast a member of a structure out to the containing structure
 * @ptr:        the pointer to the member.
 * @type:       the type of the container struct this is embedded in.
 * @member:     the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

它添加了一些类型检查。使用您的版本,可以正常编译(没有警告):

struct foo { int bar; };

....

float a;
struct foo *var = container_of(&a, foo, bar);

对于内核版本,编译器报告:

warning: initialization from incompatible pointer type

很好地解释了宏的工作原理:容器的 http://www.kroah.com/log/linux/container_of.html作者:格雷格·克罗-哈特曼。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux/list.h 中container_of 宏背后的基本原理 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点

随机推荐

  • 如何在 pyplot 中以对数比例绘制 secondary_y

    我想在一个图中有两条线 或更好的散点图 辅助 Y 线应采用对数刻度 如何使用 python matplotlib 做到这一点 您可以使用以下命令创建第二个 y 轴ax2 ax twinx 然后 正如 tacaswell 在评论中指出的那样
  • 在 Visual Studio 解决方案资源管理器中标记或突出显示文件

    是否有一个插件允许我在 Visual Studio 中标记或标记文件 然后这些文件会以视觉方式突出显示 例如不同的背景颜色 我搜索了 Visual Studio Gallery 但没有找到任何东西 Thanks 要仅突出显示解决方案资源管理
  • mysql TIME_WAIT;连接数过多问题

    当我在现场检查 mysql 加载时间时 我得到的结果显示连接为 TIME WAIT 即使我关闭了每个页面上的连接 有时网站无法加载 表示连接太多 有什么办法可以解决这个问题 预先感谢您的任何回复或建议 如果客户端连接到 MySQL 服务器
  • 使用 imshow 打印一种颜色 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想使用 RGB 值在屏幕上打印颜色 并且输出应该只是单一颜色 例如 如果我给出红色的 RGB 值 我希望输出显示红色
  • 如何在 Keras 中使用 model.reset_states() ?

    我有顺序数据 并且声明了一个 LSTM 模型来预测y with x在喀拉斯 所以如果我打电话model predict x1 and model predict x2 调用是否正确model reset states两者之间predict
  • 如何使用 SwiftUI 在视图上检测向上、向下、向左和向右滑动

    我正在着手构建 Apple Watch 应用 我目前正在做的工作将要求我利用检测四个主要方向的滑动 UP DOWN LEFT and RIGHT 问题是我不知道如何检测到这一点 我环顾四周 发现自己走进了死胡同 我可以对下面的视图做什么才能
  • JQuery UI 翻转文本,就像gumroad.com [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图在我
  • 在 Chapel 文件中包含第二个源文件

    在 C 中 当我需要 actions cpp 中的类时classes cpp我包括标题 例如 include
  • 如何读取和遍历 inode

    我已经在 EXT2 文件系统中打开了超级块和组描述符 但我不知道如何读取根目录或其中的文件 这是我得到的一些内容 fd open dev sdb2 O RDONLY lseek fd SuperSize SEEK SET read fd s
  • 创建一个可以在 React 上拖放列和行的表格

    我想创建一个可以在 React 上拖放列和行的表格 我看过其他解决方案 例如反应美丽 dnd https github com atlassian react beautiful dnd 表格拖动器 https github com sin
  • 如何从非组件辅助函数访问 redux 的存储?

    我有一个辅助函数 当我想从 Redux 存储中删除某些内容时 我会调用它 但是 我需要能够访问函数内的当前存储 以确定下一步要做什么 这就是我想做的 export function deleteDocument id this props
  • 如何制作自己的 P2P 软件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我怎样才能制作自己的napster 这些 p2p 程序使用哪个库 我不太熟悉套接字编程的概念 你能用Qt4制作p2p程序吗 从 Napst
  • Instagram 风格的多媒体列表视图

    我尝试过搜索但没有找到明确的答案 我想知道创建一个列表视图的最佳方法 该列表视图可以使用媒体控制器显示音频 视频视图项目 用户可以为每个项目播放 暂停等 我认为实现纹理视图将是前进的方向 我相信视频视图与滚动视图不能很好地配合 但我不确定从
  • 如何在 Json.NET 中使用 JsonSerializerSettings 在属性中指定时禁用 TypeNameHandling?

    有时我需要抑制输出 type 即使由 Json NET 指定属性JsonPropertyAttribute ItemTypeNameHandling https www newtonsoft com json help html P New
  • 检查字符串是否仅包含 utf8 字母

    我一直在寻找一种用 Javascript 处理这些东西的方法 PHP 有一个处理 unicode 字符的库 称为Unicode 字符属性 http php net manual en regexp reference unicode php
  • 恢复0的SKPhysicsBody仍然会反弹

    我正在尝试以恒定速度掉落 SKSpriteNode 并且不会弹跳 这是我正在使用的代码 SKSpriteNode floor SKSpriteNode spriteNodeWithColor UIColor clearColor size
  • slim php框架 图片上传放入数据库

    我是 slim php 框架的新手 我想上传图像并将文件名放入数据库中POST 有人可以给我一些示例代码吗 这是路由器 app gt post uploadFile 这将指向下面的函数 function uploadFile if isse
  • HttpListener 被调用两次

    我正在使用此代码来实现 Http Server public Server httpListener new HttpListener httpListener Prefixes Add Server UriAddress StartSer
  • ASP .Net:AspNetSqlMembershipProvider“唯一电子邮件”问题

    我在 ASP Net 4 Web 应用程序项目中使用 AspNetSqlMembershipProvider 我已在 web config 文件中将用户地址配置为唯一 requiresUniqueEmail true 如下所示
  • linux/list.h 中container_of 宏背后的基本原理

    在linux内核列表中的实现 include linux list h 第一行 粘贴在下面 背后的基本原理是什么container of macro const typeof type 0 gt member mptr ptr 在我的示例代