这个宏定义是做啥的?

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:很高兴能帮上忙!

以上是关于这个宏定义是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中啥是宏定义,它是干啥的?

MAKEWORD 是做啥用的?

不明白,getSingularObjectFromString 方法是做啥的?

“使用asm”到底是做啥的?

NetBeans是Java里面是做啥的?

“prometheus-operated”服务是做啥的?