gpt4 book ai didi

c - 如何在不公开其类型的情况下公开 C 结构大小?

转载 作者:太空狗 更新时间:2023-10-29 16:05:21 24 4
gpt4 key购买 nike

我在 C(不是 C++!)中有以下内容:

module.c
struct Private {...};
void foo(void* private, int param) {...}

module.h
#define PRIVATE_SIZE ???;
void foo(void* private, int param);

main.c
char m1[PRIVATE_SIZE];
char m2[PRIVATE_SIZE];

int main()
{
foo(m1, 10);
foo(m2, 20);
}

我如何在编译时公开 sizeof(Private) 以便应用程序可以静态分配其存储而不公开 Private 类型?

请注意,这是一个非常有限的嵌入式系统,动态分配不可用。

最佳答案

您不应该将结构的大小暴露给调用者,因为这首先破坏了私有(private)封装的全部目的。您的私有(private)数据的分配与调用者无关。另外,避免使用 void*,因为它们完全缺乏类型安全。

这就是你在 C 中编写私有(private)封装的方式:

  • 在module.h中,前向声明一个不完整的类型typedef struct module module;
  • 在module.c 中,放置这个结构的结构定义。它只对 module.c 可见,对调用者不可见。这称为不透明类型
  • 调用者只能分配指向该结构的指针,不能分配对象。
  • 调用方代码可能如下所示:

    #include "module.h"
    ...
    module* m;
    result = module_init(&m)
  • module_init 函数充当“构造函数”,在 module.h 中声明并在 module.c 中定义:

    bool module_init (module** obj)
    {
    module* m = malloc(sizeof *m);
    ...
    m->something = ...; // init private variables if applicable

    *obj = m;
    return true;
    }
  • 如果调用者确实需要知道对象的大小,那只会是为了硬拷贝等目的。如果有需要,提供一个封装分配和复制的复制函数("复制构造函数”),例如:

    result module_copy (module** dst, const module* src);

编辑:

请注意,分配方式是一个单独的问题。您不必为上述设计使用动态分配。例如,在嵌入式系统中,通常使用静态内存池来代替。参见 Static allocation of opaque data types

关于c - 如何在不公开其类型的情况下公开 C 结构大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com