带有包装结构的不透明 C 结构

问题描述 投票:0回答:1

我正在阅读有关 c 中不透明结构的内容,我想知道为什么似乎(至少我没有找到任何东西)没有人做这样的事情

struct LED_ {
    short pin;
    bool on;
};

typedef struct LED {
    uint8_t _raw_data_[sizeof(struct LED_)];
} LED;

并且只暴露

LED
。这样我仍然可以将它放在堆栈上,泄漏的唯一附加信息是结构大小。

LED l = DEFAULT_LED;

我每次都必须在内部进行转换,但这应该不是问题?这是一个坏主意吗?为什么?

c struct
1个回答
0
投票

我能想到的原因有两个。

  1. 某些处理器有对齐要求,并且不能保证
    LED
    struct LED_
    具有相同的对齐方式。因此,如果您尝试做类似的事情
short
get_pin(const LED *led)
{
    return ((struct LED_*)led)->pin;
}

您可以调用未定义的行为。

现在,您可以使用自 C11 以来可用的

alignas
来修复此问题。

  1. 这是更重要的问题。不透明结构类型的目的是用户不应该看到结构的实际布局。为了使
    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;
};

在源文件中。

© www.soinside.com 2019 - 2024. All rights reserved.