【发布时间】:2019-07-13 21:19:06
【问题描述】:
我在 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 类型?
注意,这是一个非常有限的嵌入式系统,动态分配不可用。
【问题讨论】:
-
为什么静态分配需要它?如果你仍然需要一个 init 函数,为什么不在该函数中动态分配内存呢?
-
听起来你做不到:要确定你需要知道其所有成员的大小;隐藏其成员意味着您无法确定大小。
-
这看起来像是一种信息隐藏模式。看看这个代码示例,或许对你有帮助:github.com/adamtornhill/PatternsInC/tree/master/1_FirstClassADT
-
您可以在 module.c 中定义一个 (const) size_t 变量,该变量使用
sizeof(Private)(在那里已知)进行初始化,并通过 module.h 中的声明将其公开以供公众使用。 [实际上,该变量可能是返回其值的函数中的静态变量;这避免了静态初始化顺序问题。]顺便说一句,我还想知道您是否可以前向声明 Private 并进行更好的类型检查,例如带有Init()的参数。 -
您不应该忽视对齐要求,因为您的业务只是展示尺寸。
标签: c