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