当您SocialNetwork_t
在实现文件SocialNetwork.c中定义结构时,编译器在编译User_Network.c时无法知道结构的内容,如果您只使用#include <SocialNetwork.h
那里。编译器解析头文件SocialNetwork.h并知道它应该SocialNetwork_t
稍后找到结构的定义,但在编译 .h 中的取消引用时不会遇到该定义void aaa(...)
。因此,将完整的结构定义放入SocialNetwork.h中。
[更新]我会详细说明这个答案。我猜你的文件User_Network.c看起来像这样:
#include "SocialNetwork.h"
struct User_Networks_t {
SocialNetwork network;
};
typedef struct User_Networks_t* User_Networks;
void aaa(User_Networks u1)
{
u1->network->Name = "test"; /// ERROR: dereferencing pointer to incomplete type
}
当您的编译器编译此文件时,预处理器将 `#include "SocialNetwork.h" 替换为该文件的内容,从而为您提供:
/* START content from the included file */
typedef struct SocialNetwork_t* SocialNetwork;
/* END */
struct User_Networks_t {
SocialNetwork network;
};
typedef struct User_Networks_t* User_Networks;
void aaa(User_Networks u1)
{
u1->network->Name = "test"; /// The struct SocialNetwork is not defined here
}
当编译器开始实际编译时,这将是完整的文件。因此,当您尝试从 访问该Name
字段时struct SocialNetwork
,编译器看不到结构,而只看到指针类型的 typedef。因此,它无法知道您实际指的是哪种类型。