这个宏定义是做什么的?

4

我不知道typedef中的ALIGMENT_ATTRIBUTE(B)是要做什么,因为它是一个空定义。它是否形成了一个函数?

#define ALIGNMENT_ATTRIBUTE(B)

typedef ALIGNMENT_ATTRIBUTE(8) UInt64   T_AUInt64;

2
除非询问两种语言之间的差异或交互作用,否则请勿同时标记C和C ++。 - Eric Postpischil
1
该宏是某些多目标或多对象构建方案的一部分。当选择其他构建目标或选项时,该宏将被定义为提供对齐属性的替换文本。在发布问题时,您应该展示更多上下文信息。 - Eric Postpischil
2
@EricPostpischil:由于它是预处理器宏,因此可以用于两种语言。由于没有人寻找预处理器标记,因此将其标记为C和C++非常好! - Klaus
1
@Klaus:C标签的指导方针是“在没有合理的理由的情况下,不应将其与C++标签结合使用”,而想要吸引那些选择关注C标签但不关注C++标签(或反之)的人的注意力是不尊重的标签垃圾邮件,而不是合理的理由。 - Eric Postpischil
2
我同意@Klaus的观点。仅仅因为一个问题被标记为两种语言,而实际上问题内容并不特定于其中任何一种语言,就关闭这个问题的做法通常是有害的。在这种情况下,一个相当好的(完全“合法”的)问题无缘无故地被关闭了。依我看。 - user16004728
1个回答

7

它可用于需要对齐的平台。

例如,它可以在需要 uint64 位于可被8整除的地址的平台上使用。

在这种情况下,您需要使用平台的对齐强制机制(通常是编译器特定的)扩展ALIGNMENT_ATTRIBUTE(B)的定义,例如#pragma align(8)alignas(8)_declspec(align(8))

在您的具体示例中,它被定义为空,这意味着您的平台没有任何对齐限制。


1
顺便说一句,我上面写的一切都是基于直觉(以及一点常识)。我并不确定所有这些内容,因为我从未遇到过这样的情况,即您想要支持根本不同的平台。它似乎只是对问题顶部的空定义的最合理解释。 - user16004728
1
可能在某些平台上,alignof(UInt64)的值为8,在另一些平台上则为4,这会影响结构体的填充(或是符合某些ABI约束条件)。因此,在32位平台上,该定义是这些对齐说明符之一。 - Artyer
2
@bbbbbbbbb 天啊,非常感谢你的清晰解释。这是我在浏览一个开发于上世纪80年代或更早时期的程序时遇到的一段代码。 - jojo_Aero_smith_the_dummy
@jojo_Aero_smith_the_dummy:很高兴能帮到你! - user16004728

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接