仅公开所需信息,不包括不必要的头文件
我想要一个进程来公开消息的结构,因此它可以被接收它的其他进程使用。 但是,此结构包括在其他头文件中定义的参数类型,这些头文件本身包含一堆其他头文件。
typedef struct sfp_info_s { int port; char platform_id[50]; sff_eeprom_t sff_type; char status_str[50]; sff_dom_t sff_dom; }sfp_info_t;
sff_eeprom_t在名为:sff_db.h的头文件中定义,该文件本身包含其他文件:
#ifndef __SFF_SFF_H__ #define __SFF_SFF_H__ #include #include #include
创建此API的最佳方法是什么,而不是在所有需要只知道消息结构的进程中包含所有这些文件?
C标准允许将指向结构的指针转换为指向其第一个成员并返回的指针。 因此,您可以将要公开的成员打包到结构中并将其发布到公共标头中:
typedef struct { int port; char platform_id[50]; } sfp_public_t;
在私有标题中,您将拥有:
typedef struct { sfp_public_t public; sff_eeprom_t sff_type; char status_str[50]; sff_dom_t sff_dom; } sfp_info_t;
给定sfp_info_t
的指针p
,您可以将其转换为指向sfp_public_t
的指针并将其传递给其他代码。 当您从其他代码接收到这样的指针时,您可以将其转换为指向sfp_info_t
的指针。
其他代码当然不知道对象的真实大小,因此无法分配新实例。 您的API需要提供支持例程来分配此类对象。
缺点是这需要您在代码中使用p->public.name
而不是p->name
来访问打包的成员,尽管接收转换指针的代码可以简单地使用p->name
。 我想你可以通过在sfp_info_t
使用匿名结构成员来避免这种sfp_info_t
。 但是匿名结构不能使用标记或类型名声明,因此您需要重复声明:
typedef struct { struct { int port; char platform_id[50]; }; sff_eeprom_t sff_type; char status_str[50]; sff_dom_t sff_dom; } sfp_info_t;