如何使用封装在源文件之间传递typedef的定义?

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

在提供的链接中-https://embeddedgurus.com/barr-code/2010/11/what-belongs-in-a-c-h-header-file/

Michael Barr陈述以下内容:

不要公开传递给一个或多个模块接口功能或从其返回的任何特定于模块的数据结构的内部格式。也就是说,任何头文件中都不应包含“ struct {…} foo;”代码。如果确实有类型,则需要传入和传出模块,以便客户端模块可以创建它的实例,只需在头文件中“ typedef struct foo foo moduleb_type”即可。客户端模块永远不应该知道,而且这种方式也不知道结构的内部格式。

我了解的是,如果有一个模块说“ led”要由客户端模块使用,例如说“ main”,则主模块不应该知道模块“ led”的内部工作原理。这是我按照建议执行的操作,但似乎无法实现:

led.c:] >>

#include "led.h"

typedef enum
{
    RED = 0,
    GREEN

} e_LedColor_t;

typedef enum
{
    FAST = 0,
    SLOW,
    DIRECT,
    OFF,
    HEARTBEAT,
    DOUBLE_BLINK,
    IDENTIFICATION

} e_LedMode_t;

struct Led
{
    e_LedColor_t color;
    e_LedMode_t mode;

};

led.h:

#ifndef LED_H
#define LED_H

typedef struct Led led_t;

#endif

main.c

] >>
#include "led.h"

int main() {

    led_t led;

    return 1;
}

我在行内说到错误[错误:字段具有不完整的类型'ledt_t'(又名'struct led')

只是因为主模块无法识别Led结构的定义,所以它会引发错误。但是,如果我做一个定义,那么整个封装的想法就会丢失。肯定有些东西我误会了,但我不知道那是什么。谁能帮我吗?

[在提供的链接中-https://embeddedgurus.com/barr-code/2010/11/what-belongs-in-ach-header-file/ Michael Barr声明以下内容:不要公开任何内部格式特定于模块的数据...

c struct embedded typedef encapsulation
1个回答
2
投票
[它可能比Micheal所提供的解释还多,但是我认为他的意图是为有经验的从业者制定“规则”,而不是讲授[[不透明的类型-他假定听众中的理解水平-也许您必须购买他的一本书才能获得完整的瘦身;-)
© www.soinside.com 2019 - 2024. All rights reserved.