【发布时间】:2020-09-22 19:41:15
【问题描述】:
我在 SameBoy 模拟器 (v0.13) 中遇到了一组奇怪的宏,它们似乎使用空结构来寻址数据。它看起来像这样:
#define GB_PADDING(type, old_usage) type old_usage##__do_not_use
#define GB_SECTION(name, ...) \
__attribute__ ((aligned (8))) struct {} name##_section_start; \
__VA_ARGS__; \
struct {} name##_section_end
#define GB_SECTION_OFFSET(name) \
(offsetof(GB_gameboy_t, name##_section_start))
#define GB_SECTION_SIZE(name) \
(offsetof(GB_gameboy_t, name##_section_end) - offsetof(GB_gameboy_t, name##_section_start))
#define GB_GET_SECTION(gb, name) \
((void*)&((gb)->name##_section_start))
似乎GB_gameboy_t 是某种类型(可能是GameBoy 的内部结构)。然而,困扰我的部分是 GB_SECTION 和 GB_GET_SECTION 宏。很明显,这些宏的目的是对齐数据。但是,我对空结构(标记为name##_section_start)的扩展感到迷茫。 它是否扩展为空(即 0 字节)?如果是这样,那么GB_GET_SECTION 将指向__VA_ARGS__ 是什么。但是,__attribute__ ((aligned (8))) 限定符的意义何在?或者空结构是否扩展为一些垃圾填充字节?如果是,那么GB_GET_SECTION 将指向垃圾数据。
那么它是哪一个?
【问题讨论】:
-
标准 C 不允许空结构。因此,代码可能使用了某种编译器扩展(GCC 可能确实允许空结构)。
-
@NateEldredge
(aligned(8))不会让事情复杂化吗? -
顺便说一句,“取消引用”结构的意思还不是很清楚;解引用是你对指针所做的事情,结构不是指针。
-
@nanoman 获取地址是引用(与取消引用相反)
标签: c gcc struct padding memory-alignment