C语言 仅公开所需的信息,不包含不必要的头文件



我希望一个进程公开消息的结构,以便接收它的其他进程可以使用它。 但是,此结构包括在其他头文件中定义的参数类型,这些头文件本身包括一堆其他头文件。

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 <sff/sff_config.h>
#include <AIM/aim_pvs.h>
#include <dependmodules.x>

创建此 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_tp指针,您可以将其转换为指向sfp_public_t的指针并将其传递给其他代码。当您从其他代码收到此类指针时,可以将其转换为指向sfp_info_t的指针。

其他代码当然不知道对象的真实大小,因此它无法分配新实例。API 需要提供支持例程来分配此类对象。

缺点是这要求您使用p->public.name而不是代码中的p->name来访问打包成员,尽管接收转换指针的代码可以简单地使用p->name。我认为您可以通过在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;

最新更新