SocialNetwork_t
実装ファイルSocialNetwork.c で構造体を定義すると、そこでのみ使用する場合、コンパイラはUser_Network.cをコンパイルするときに構造体の内容を知ることができません。コンパイラはヘッダー ファイルSocialNetwork.hを解析し、後で構造体の定義を検出する必要があることを認識しますが、逆参照のコンパイル時にその定義に遭遇しません。したがって、完全な構造体定義をSocialNetwork.hに入れます。#include <SocialNetwork.h
SocialNetwork_t
void aaa(...)
[更新] その答えについてもう少し詳しく説明します。ファイル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 のみを認識します。したがって、実際に参照しているタイプを知ることはできません。