我正在阅读有关 c 中不透明结构的内容,我想知道为什么似乎(至少我没有找到任何东西)没有人做这样的事情
struct LED_ {
short pin;
bool on;
};
typedef struct LED {
uint8_t _raw_data_[sizeof(struct LED_)];
} LED;
并且只暴露
LED
。这样我仍然可以将它放在堆栈上,泄漏的唯一附加信息是结构大小。
LED l = DEFAULT_LED;
我每次都必须在内部进行转换,但这应该不是问题?这是一个坏主意吗?为什么?
我能想到的原因有两个。
LED
与 struct LED_
具有相同的对齐方式。因此,如果您尝试做类似的事情short
get_pin(const LED *led)
{
return ((struct LED_*)led)->pin;
}
您可以调用未定义的行为。
alignas
来修复此问题。
sizeof(struct LED_)
有意义,编译单元需要查看 struct LED_
的定义。不透明结构的典型呈现方式是通过放置
typedef struct LED_ LED; // There is something called `struct LED_` and let's abbreviate it as `LED`.
在头文件和实际定义中:
struct LED_ {
short pin;
bool on;
};
在源文件中。