C-定义宏中的双下划线

C-定义宏中的双下划线,c,C,我做了一些搜索,并咨询了我的一位朋友,但也希望获得StackExchange社区的输入。在前言中,我主要是一个硬件人员,已经被扔进了低级固件领域,所以请原谅我的常识。我以前做过C编程,但已经有一段时间了 对于定制ASIC,我是其中的一员,我们有许多控制/状态寄存器,我们将通过软件/固件访问这些寄存器(从现在起,我可能只称之为SW)。对于我们的verilog/SV/UVM测试台,我们有一个构建verilog头文件define文件的脚本。在这种情况下,我们有以下结构: `define REG_NAM

我做了一些搜索,并咨询了我的一位朋友,但也希望获得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>
`define REG\u NAME

带前缀的下划线不是一种好的编码实践。像这样在define中使用双/三下划线通常是一种糟糕的编码实践吗?我知道我可以控制宏define以双下划线/三下划线开头或结尾。老实说,这对我很有帮助。当所有的下划线都被使用时,我很难分辨出单词之间的区别。由于基于寄存器的定义超过了60k,我想用一种更干净的方式来看待它。然而,如果这是大多数软件工程师会呕吐的东西,我会改变它,因为迟早(希望)有一个真正的软件工程师会处理大部分这件事(我并不介意做软件,这很有趣)

如果已经讨论过这一点,请随时转发该线程。我四处搜索了大约30-45分钟,但找不到任何能准确讨论这个话题的东西

谢谢

在C++ +<强>仅,包含两个连续下划线的标识符(如您的代码> ReGyNAMEYS.BITFIEL1YSMADS)也被保留用于实现。

>,就标准而言,可以在C中做你想要的,但是在C++中<>强>不<强> >

就风格而言,我个人认为你希望在一行中使用两个下划线(许多名称中有结构的类似标识符,使结构更明显)的理由是合理的,我不同意相关问题中的人说很难区分一个下划线和两个下划线,读书的时候。我不明白你为什么要一行三个下划线,而且我认为很难区分两个和三个下划线之间的区别

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


(您可以使用由实现定义的以下划线开头的标识符,只要它们是有文档记录的,例如
\uuu STDC\uuuu
\ubool
\uiolbf
——除非文档明确告诉您要定义它们,否则不要自己定义它们(例如
\uPOSIX\uC\uSource
)。在复杂的程序中,“程序”和“实现”之间的界限可能会变得模糊,因此,如果您看到一个定义标识符的程序以下划线开头,请不要惊慌;作者很有可能准确地知道他们在做什么。)

因为没有功能更改,这完全是一个品味的问题。除了标准中规定的(比如最初的双下划线),标识符完全由您决定。如果你想让他们在中间有第二、第55555、第二、第三,就把它放在一边,这不是COODE练习;根据字体的不同,可能很难区分一个或两个底色,而且看起来很难看。为什么你认为你需要两个下划线?看起来,只有一个下划线的区别很好。另一种选择是使用混合大小写,如
REG\u NAME\u bitfield1
@Olaf就编码实践而言,大写和小写的混合不是真的差不多吗?虽然这不是个糟糕的主意。我真的只想要一个以上的下划线,因为a)我更容易看到,b)它与我们在Verilog/硬件方面的一系列基础设施相匹配。@lstevol:当然,我知道编码标准不允许它(“宏必须都是大写的”-教条,句号),但允许双下划线,三下划线等。这都是自以为是的,这正是问题不在这里的原因。尽管如此,我认为我有很好的反对双下划线的论点,我的方法看起来更像是名字间隔(一个也可以用后缀部分的CAMEL案例)。C++一般会有一个问题,这是我找到另一个方法的原因。谢谢你提供的内容丰富的帖子。还有,是的,我不小心链接了一篇python帖子。打开的选项卡太多,抱歉!
#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