【发布时间】:2017-04-18 00:19:32
【问题描述】:
我进行了一些搜索并咨询了我的一位朋友,但也想获得 StackExchange 的社区意见。前言我主要是一个被猛烈抨击到低级固件领域的硬件人,所以请原谅我任何看似常识的事情。我过去做过 C 编程,但已经有一段时间了。
对于自定义 ASIC,我属于其中之一,我们有许多控制/状态寄存器,我们将通过软件/固件访问它们(从现在开始,我很可能将其称为 SW)。对于我们的 verilog/SV/UVM 测试平台,我们有一个脚本可以构建一个 verilog 头文件`define 文件。在这种情况下,我们有以下结构:
`define REG_NAME <addr of register>
`define REG_NAME__BITFIELD1 <bit vector i.e. 1:0>
`deinfe REG_NAME__BITFIELD2 <bit vector i.e. 4:2>
我们使用双下划线在视觉上区分寄存器名称和位域。然后,我们使用它来执行诸如读取-修改-写入、屏蔽位等操作。对于 SW,我编写了一个脚本以打印出 C 格式的 .h 文件。我想保持类似的格式:
#define REG_NAME <addr of register>
#define REG_NAME__BITFIELD1___MASK 0x00000003
#define REG_NAME__BITFIELD1___SHIFT 0
#deinfe REG_NAME__BITFIELD2___MASK 0x0000001c
#deinfe REG_NAME__BITFIELD2___SHIFT 2
在这种情况下,我想保留双下划线以区分 REG 和 BIT_FIELD,并保留三重线以区分 MASK/SHIFT/我添加的任何其他内容。
我知道基于以下 SE 问题: Use of double underscore in C How is __mro__ different from other double underscore names?
前缀下划线不是一个好的编码习惯。像这样在定义的内部使用双/三下划线通常是一种不好的编码习惯吗?我知道我可以控制宏定义从不以双/三下划线开头或结尾。老实说,这对我有很大帮助。当使用所有单下划线时,我很难找出单词之间的差异。并且有超过 60k #defines 基于寄存器,我希望有一种更简洁的方式来查看它。但是,如果这是大多数 SW 工程师会吐槽的东西,我迟早会更改它(希望)真正的 SW 工程师会处理大部分内容(我不介意做 SW,这很有趣)。
如果已经讨论过这个问题,请随时转发该主题。我搜索了大约 30-45 分钟,但找不到任何似乎完全讨论该主题的内容。
谢谢!
【问题讨论】:
-
由于没有功能上的变化,这完全是个人喜好问题。
-
除了标准中指定的(例如 initial 双下划线的东西),标识符完全取决于你。如果您希望它们在中间有 __、___、ZZZZ 或 55555,那就去吧。
-
除了格式方面,这不是代码实践;取决于字体,很难区分一两个下划线,而且看起来很丑。为什么你认为你需要两个下划线?看起来,一个下划线的区别很好。另一种方法是使用混合大小写,例如
REG_NAME_bitfield1。 -
@Olaf 就编码实践而言,大写和小写的混合真的不会是相同的论点吗?虽然这不是一个可怕的想法。我真的只想要一个以上的下划线 a) 它更容易让我看到,b) 它与我们在 Verilog/硬件方面的一堆基础设施相匹配。
-
@lSteveol:当然可以,而且我知道不允许它的编码标准(“宏必须全部大写” - 教条,句号),但允许双下划线,tribble 等。这都是自以为是的,这正是问题在这里过时的原因。尽管如此,我认为我对双下划线有很好的论据,而且我的方法更像是名称间距(也可以使用 Camel-Case 作为后缀部分)。
标签: c