在提供的链接中-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;
}
我在俗话说的 led_t led; 行中收到错误:
错误:字段的类型'ledt_t'(又名'struct led')不完整
仅由于主模块无法识别Led结构的定义,它会引发错误。但是,如果我做一个定义,那么整个封装的想法就会丢失。肯定有些东西我误会了,但我不知道那是什么。谁能帮我吗?