gpt4 book ai didi

c - 尝试避免在没有 pimpl 的情况下在 header 中显示私有(private)属性

转载 作者:行者123 更新时间:2023-11-30 14:33:38 25 4
gpt4 key购买 nike

我认为我的头文件是我的模块的接口(interface)。我真的不喜欢向用户展示他们不需要在我的界面中看到的东西。

C 语言人员通过预先声明结构并让函数传递指向该结构的指针来实现这一点。

这是完美的,除非结构的一部分是公共(public)的。我的用户需要能够自由访问和修改它。

一种解决方案是执行 setter 和 getter 并将指针传递给我们不显示定义的结构。

我们也可以像 c++ pimpl 那样做,在外部结构中我们有一个指向内部结构的指针。再次在界面中显示我们不应该显示的内容。

然后我有了一个想法。我想要你的意见。告诉我你认为这是好还是坏。

东西.h:

/// Must use thing_init() or bad will happen
struct thing
{
int public_attribute;
};

typedef struct thing thing;

thing*
thing_init();

东西.c:

struct internal
{
int private_attribute;
};

typedef struct internal internal;

thing*
thing_init()
{
void* mem = malloc(sizeof(internal) + sizeof(thing));

internal* i = (internal*)mem;
thing* t = (thing*)(mem + sizeof(internal));

// Initialize stuff

return t;
}

这个想法就像 malloc 基本上是如何做事的。这里可能会出现什么问题?

最佳答案

你的方法被破坏了。例如,如果公共(public)部分有一个 double 而私有(private)部分只有一个 char,则算术将导致公共(public)部分未对齐。

<小时/>

您可以使用和应该使用的是常见的初始前缀:

struct thing {
int public_attribute;
};

struct internal {
struct thing public;
int private_attribute;
};

struct thing *thing_init()
{
struct internal *mem = malloc(sizeof(struct internal));
internal->public->public_attribute = 6 * 9;
internal->private_attribute = 42;

return &interal->public;

// or
return (struct thing *)internal;
}

即公共(public)部分是整个结构的第一个成员。该技术在 C 中已明确定义。

然后,在进入 struct thing * 的所有函数中,将此指针强制转换为 struct internal *,并准备好使用公共(public)和私有(private)成员。

该技术用于例如由 CPython 解释器执行,其中 C 代码中的所有 Python 对象共享一个公共(public)的 PyObject 初始序列,后跟私有(private)部分。

关于c - 尝试避免在没有 pimpl 的情况下在 header 中显示私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59222875/

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