c - 这个C工会的成员有什么区别吗?
问题描述
下面的 typedef 用于 Atmel SAMD21 ARM MCU 包含文件中的 DIR 寄存器。既然bit struct成员和reg成员都是32位的,那么联合中的两个成员有什么区别吗?
我试图理解为什么他们不只是使用 uint32_t 作为 DIRSET 寄存器的类型。我唯一的想法是他们只是以这种方式定义它以与位结构中有多个字段的其他寄存器保持一致。
typedef union {
struct {
uint32_t DIRSET:32;
} bit;
uint32_t reg;
} PORT_DIRSET_Type;
解决方案
从一般的角度来看,这只是代码膨胀——你没有理由想要编写这样的代码。但是,ASF 编码风格是每个寄存器访问都以 结尾.reg
,所以这就是这里的原因:他们希望保持寄存器命名和使用一致。
他们当然可以这样做,typedef struct { uint32_t reg; } PORT_DIRSET_Type
但是这个代码库很少被合理地编写。它可能是通过一些脚本自动生成的。
根据经验,像这样的寄存器映射总是非常丑陋且不可移植,充满了不合理的代码。作为 ASF 的一部分运送的那些是我见过的所有类别中最糟糕的。
推荐阅读
- excel - 单元格值不会更新
- javascript - 如何在 android webview 中使用 html5 地理位置修复“位置不可用”错误?
- elixir - 如何将 test.watch 与 `iex -S mix phx.server` 集成
- java - 在 Marshmallow(6.0+) 设备上的 onCreateViewHolder 方法中膨胀 RecyclerView 项目的布局时引发“android.view.InflateException”
- ruby-on-rails - 无法理解 Rails 控制器的 Telegram Bot 输出
- python - Django:具有唯一约束的 CreateView 和 UpdateView 中的不同行为
- reactjs - 你如何访问 react-apollo-hooks 中 useMutation 返回的数据?
- haskell - Haskell中不正确的“非详尽模式”异常?
- vue.js - vue 项目在 dist 中包含 htaccess 文件
- excel - VBA中一个参数具有OR条件的countifs的正确语法是什么?