【问题标题】:C - Double underscore inside of #define macro [closed]C - #define 宏内部的双下划线[关闭]
【发布时间】: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


【解决方案1】:

在 C 和 C++ 中,您(应用程序程序员)应该避免开始 标识符,即使是单个下划线 - 至少在某些情况下,所有这些标识符都是“为实现保留的”;而不是记住确切的规则,最简单的方法是坚持以字母开头所有标识符。

仅在 C++ 中包含两个连续下划线的标识符(如您的REG_NAME__BITFIELD1___MASK)也保留用于实现。

因此,就标准而言,您可以在 C 中做您想做的事,但在 C++ 中不能

就风格而言,我个人认为您希望连续使用两个下划线的理由(许多名称中带有结构的相似标识符,使结构更加明显)是合理的,我不同意链接问题中的人说在阅读时很难区分一个和两个下划线之间的区别。不过,我不明白您为什么要连续 三个 下划线,而且我确实 认为很难区分连续两个和三个下划线之间的区别。

(注意:您链接到的一个老问题是关于 Python,它是一种完全不相关的语言;它不能用来得出关于 C 或 C++ 的结论。)

(您可以使用由下划线开头的实现定义的标识符,只要它们被记录在案——例如__STDC___Bool_IOLBF——永远不要定义他们自己,除非文档明确告诉你定义它们(例如_POSIX_C_SOURCE)。在复杂的程序中,“程序”和“实现”之间的界限可能会变得模糊,所以不要'如果您看到定义以下划线开头的标识符的程序,请不要惊慌;作者很有可能确切地知道他们在做什么。)

【讨论】:

  • C++ 通常会遇到这个问题的事实就像是我找到替代方法的原因。感谢您提供信息丰富的帖子。
  • 另外,是的,我确实不小心链接了一个 python 帖子。打开的标签太多,抱歉!
猜你喜欢
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多