隐藏内部类型

Pet*_*lev 9 c embedded

我想隐藏库用户的内部类型.
目前我有这样的事情:

foo.h中

typedef struct public
{
    uint16 a;
    //...
    unsigned char internals[4];
} public_type;
Run Code Online (Sandbox Code Playgroud)

foo.c的

typedef struct public
{
    uint32_t a;
}internals_type;
Run Code Online (Sandbox Code Playgroud)

然后在函数中,我正在做一个类似的演员.

void bar(public_type * const public_struct)
{
     internals_type* const internals = &public_struct->internals;
     intrnals->a = getSomething();
     // .....
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

我已经尝试了一些奇怪的东西与标题中的联合和指针,但没有什么似乎更好,我很好奇,如果这可以得到任何更清洁或至少如果从一种类型指针指向另一种指针的警告可以被删除.

Som*_*ude 18

我建议你阅读更多关于不透明数据类型的内容,并考虑例如FILE结构.

简而言之,不要将您的结构分为"公共"和"私有"变体(这种方式是疯狂和可能的未定义行为).相反,只需在公共头文件中声明一个结构,并让您的函数返回指向该结构的指针或接受指向该结构的指针的参数.

然后在库中内部有一个私有头文件,它具有结构的定义,并使用该头文件进行实现.


简单的例子

公共头文件

#ifndef PUBLIC_HEADER_FILE_H
#define PUBLIC_HEADER_FILE_H

typedef my_private_structure MY_PUBLIC_TYPE;

MY_PUBLIC_TYPE *mylib_create(void);
void mylib_destroy(MY_PUBLIC_TYPE *ptr);

#endif
Run Code Online (Sandbox Code Playgroud)

私有头文件

#ifndef PRIVATE_HEADER_FILE_H
#define PRIVATE_HEADER_FILE_H

#include "public_header_file.h"

struct my_private_structure
{
    // Some private fields here
};

#endif
Run Code Online (Sandbox Code Playgroud)

私人图书馆源文件

#include "private_header_file.h"
#include <stdlib.h>

MY_PUBLIC_TYPE *mylib_create(void)
{
    MY_PUBLIC_TYPE *ptr = malloc(sizeof *ptr);
    return ptr;
}

void mylib_destroy(MY_PUBLIC_TYPE *ptr)
{
    free(ptr);
}
Run Code Online (Sandbox Code Playgroud)

public_header_file.h与图书馆一起分发.它是库用户将使用的头文件.

您的库的源代码,尤其是private_header_file.h文件的源应该分发,或者如果您创建一个开源库,则至少不会安装.

请注意,此方案使所有结构都"私有",这通常是一个好主意,因为您可以根据需要修改它,而无需库的用户需要使用您的库重建其应用程序.要访问私有结构的成员,您可以使用只返回需要访问的成员的值的函数.

  • @PetarVelev动态分配只是一个例子.您也可以返回指向编译时分配对象的指针(例如,`static`全局变量).基本原则保持不变. (2认同)