0

別の構造体にある char* へのアクセスに問題があります。コードは次のとおりです。

User_Network.c:

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 
}

これが私がSocialNetwork.hに持っているものです:

typedef struct SocialNetwork_t* SocialNetwork;

SocialNetwork.cにある構造体:

struct SocialNetwork_t {
    char *Name;
};

なぜそのエラーが発生するのですか?

4

1 に答える 1

5

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

于 2012-04-20T15:16:12.843 に答える