这个宏定义是做啥的?
Posted
技术标签:
【中文标题】这个宏定义是做啥的?【英文标题】:what does this macro definition do?这个宏定义是做什么的? 【发布时间】:2021-12-29 08:13:21 【问题描述】:我不知道 ALIGMENT_ATTRIBUTE(B) 在 typedef 中应该做什么,因为它是一个空定义。是否形成函数?
#define ALIGNMENT_ATTRIBUTE(B)
typedef ALIGNMENT_ATTRIBUTE(8) UInt64 T_AUInt64;
【问题讨论】:
除非询问两种语言之间的差异或交互,否则不要同时标记 C 和 C++。 宏是一些多目标或多对象构建方案的一部分。当为构建选择其他目标或选项时,将使用提供对齐属性的替换文本定义宏。发布此问题时,您应该显示更多上下文。 @EricPostpischil:因为它是一个预处理器宏,它可以用于两种语言。由于没有人寻找预处理器标记,因此使用 C 和 C++ 标记非常好! @Klaus:C 立场的指导是“在没有合理理由的情况下,它不应与 C++ 标签结合”,并且您希望得到选择关注 C 标签的人的注意但不是 C++ 标签(反之亦然)是不尊重标签垃圾邮件,不是合理的原因。 我同意@Klaus。这种关闭问题的方法只是因为它被标记在两种语言下,并且尽管问题的实际内容是不可知的(不特定于这些语言中的一种),但通常是有害的。在这种特定情况下,一个非常好的(并且完全“合法”)的问题无缘无故地被关闭了。恕我直言。 【参考方案1】:它可以用于对齐重要的平台。
例如,它可用于uint64
必须位于可被 8 整除的地址的平台。
在这种情况下,您需要使用平台的对齐强制机制(通常是特定于编译器的)扩展ALIGNMENT_ATTRIBUTE(B)
的定义,例如#pragma align(8)
或alignas(8)
或_declspec(align(8))
。
在您的具体示例中,它被定义为无,这意味着您的平台没有任何对齐限制。
【讨论】:
顺便说一句,我上面写的所有内容都是基于预感(以及一些常识)。我不确定这一切,因为我从来没有遇到过这样的情况,在这种情况下,您希望支持彼此根本不同的平台。这似乎是对问题顶部那个空洞定义的最合理解释。 可能在某些平台上alignof(UInt64)
为 8,而在某些平台上为 4,这与结构填充(或某些 ABI 约束的一部分)混淆,因此在 32 位平台上,定义是这些对齐之一说明符
@bbbbbbbbb OMG,非常感谢您提供清晰的解释。这是我在 1980 年代或更早之前开发的程序中遇到的一段代码。
@jojo_Aero_smith_the_dummy:很高兴能帮上忙!以上是关于这个宏定义是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章