请原谅我的冗长.

这就是我喜欢用来声明模块中的用户函数的头的方式.

struct Object;
void function( struct Object * , ... );

这只是为了模块的用户不会有一个杂乱无章的头文件,所有的东西都在 struct 中使用.

c文件具有struct定义.让我们在这个主 struct 中有 struct .

struct Object {
    int item;
    struct Component component;
};

让我们在用户定义的 struct 中使用这个模块对象.请说:

#include "module.h" /*declarations*/
...
struct UserItem {
    int something;
    ...
    struct Object object;
} userThing;

这就是我在C预处理方面的问题.

这造成了一个问题.在编译过程中, struct 对象的大小尚未定义,因此无法定义 struct UserItem的大小,编译失败,返回error: field 'object' has incomplete type

现在有什么补救办法呢?显然,可以使用 struct 指针,但这增加了使用动态内存分配进行 struct 初始化的烦人步骤.对 struct 定义使用单独的标头怎么样?好的,但这意味着 struct 符号名称现在被这些名称弄乱了,就像 struct 组件一样.此外,用户还必须包括此头文件以及主模块头文件.在我看来,这不是一个好的解决方案.也许甚至会做一些类似struct Object { uint8_t component_mem[SIZE]; };

我唯一的 idea 是在编译中有一个步骤,其中 struct 定义是全局预处理的,这样就可以找到所有大小.我相信这一定已经在链接阶段完成了,因为取消了对 struct 指针的引用?

让我知道我是否犯了一个错误,或者已经有一个很好的解决方案.

相似堆栈溢出页面(S):1

推荐答案

Information hiding是一个 sublime 的目标,但有时也是一种痛苦.

C只是不支持OP的目标,通过公共文件知道struct UserItem的内部 struct ,但不使用它们.

The best I have seen is a warning.
Move the complete definition to the .h file

// Object.h
/*
I know you may be tempted to access these struct members, but **DO NOT USE THEM**.  
They are only here for sizing purposes and zero initialization.
Only Object support function should access members.
*/

struct Component {
    int SecretDecoderRing;
    double magic_number;
    char psword[42];
};

struct Object {
    int item;
    struct Component component;
};

void Object_function1( struct Object * , ... );
void Object_function2( struct Object * , ... );

struct Component定义、struct Object定义和警告可能存在于Object. h包含的单独Object_xxx. h文件中,级别为hiding. 然而,包括Object.h最终仍然会expose 这struct个细节.

C++相关问答推荐

变量的const视图是否定义良好?

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

你能用自己的地址声明一个C指针吗?

C中是否有语法可以直接初始化一个常量文本常量数组的 struct 成员?

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

如何一次获取一个字符

为什么我不能只在内存地址中添加一个int来寻址任何数组?

加密解密工作正常,但返回错误0x80090005

在移动数组元素时获得意外输出

如何编写一个for循环来计算C中各项的总和?

关于scanf()和空格的问题

仅从限制指针参数声明推断非混叠

GCC错误,共享内存未定义引用?

C中的回文数字

如何编写postgresql支持函数

如何找出C中分配在堆上的数组的大小?

使用fread()函数读取txt文件

获取 struct 中匿名 struct 的大小

int 与 size_t 与 long