仅公开所需信息,不包括不必要的头文件

时间:2018-01-25 10:12:35

标签: c api header-files

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

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的最佳方法是什么,而不是在所有需要只知道消息结构的进程中包含所有这些文件?

1 个答案:

答案 0 :(得分:2)

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;

指向p的指针sfp_info_t,您可以将其转换为指向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;