C语言 如何在头文件中定义将在实现文件中定义的ADT结构

disho6za  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(129)

我有一个头文件,它声明了一个ADT对元组进行建模,头文件包含了一个结构体声明typedef struct Tuple * Tuple;,相应的实现文件将其定义为

struct Tuple
{
    int x;
    int y;
    int z;
    int w;
};

问题是我只想导入客户端代码中的头文件(例如测试文件或包含main的文件),而不想导入.c实现文件。如果不这样做,则在尝试从客户端代码中导入代码时会出现错误消息,例如:

Tuple tuple = ( Tuple ) calloc( 1, THREE_TUPLE_COORDINATES * sizeof( Tuple ) );
tuple->x ;

其内容如下:error: dereferencing pointer to incomplete type ‘struct Tuple’
是否可以在头文件中保留结构不完整/未定义,然后在实现文件中定义它,或者这不是最佳做法?

ddhy6vgd

ddhy6vgd1#

第一个月
是否可以在头文件中保留结构不完整/未定义,然后在实现文件中定义它,或者这不是最佳做法?
你不能在任何实际定义重要的上下文中使用 * abstract / uncomplete * 数据类型。这样的上下文包括声明示例、访问成员和确定大小。编译器怎么知道要保留多少空间?或者在空间中的什么地方找到具有特定名称的成员?或者这样的成员是否存在?
您可以在同一个翻译单元中为其中的大多数内容提供函数(s)类型定义的地方,然后让其他翻译单元依赖于那些函数。所有通过这种方式获得的示例都需要动态分配,所有成员访问都会招致函数调用的成本。这种事情有时会做,但也常常是"不"做的。一定要仔细想想你想通过做这些事情得到什么。

相关问题