我理解客户端可以在这种情况下操纵指向结构的指针,但不能取消引用它。我想知道为什么它不能被解除引用?
#ifndef STACK_INCLUDED
#define STACK_INCLUDED
typedef struct Stack_T *Stack_T;
extern Stack_T stack_new(void);
extern int stack_empty( Stack_T p_stk );
extern void stack_push( Stack_T p_stk, void *p_data );
extern void *stack_pop( Stack_T p_stk );
extern void stack_free( Stack_T *p_stk );
#endif
#include "stack.h"
struct Stack_T {
int node_count;
struct node {
void *p_data;
struct elem *p_link;
} *p_head;
};
#include "stack.h"
int main(void)
{
Stack_T stk;
...
return EXIT_SUCCESS;
}
更确切地说,为什么不能在主
中取消引用该对象答案 0 :(得分:3)
我假设“客户”是指“包含stack.h
”的源文件。
原因是struct Stack_T
文件中实际上未定义stack.h
。它被声明,typedef
确保编译器理解在某处定义struct Stack_T
,但尚未定义。
stack.c
是唯一需要知道内部 struct Stack_T
是什么的模块,因此结构的定义在该文件中。
此代码的客户端不需要知道struct Stack_T
内的内容,因此他们看不到定义。