在提供的链接中-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
只是因为主模块无法识别Led结构的定义,所以它会引发错误。但是,如果我做一个定义,那么整个封装的想法就会丢失。肯定有些东西我误会了,但我不知道那是什么。谁能帮我吗?#include "led.h" int main() { led_t led; return 1; }
我在行内说到错误[
:错误:字段具有不完整的类型'ledt_t'(又名'struct led')
[在提供的链接中-https://embeddedgurus.com/barr-code/2010/11/what-belongs-in-ach-header-file/ Michael Barr声明以下内容:不要公开任何内部格式特定于模块的数据...