ヘッダーファイルに付属している2つの構造体があります。
私の構造体番号1は:
ヘッダーファイル 'list.h':
typedef struct list * List;
ソースファイル 'list.c':
struct list {
unsigned length;
char * value;
};
私の構造体番号2は:
ヘッダーファイル 'bal.h':
typedef enum {START, END, MIDDLE, COMMENTS, CONDITIONS} TypeListBal;
typedef struct bal * Bal;
ソースファイル 'bal.c':
i've include those header files :
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "list.h"
struct bal {
TypeListBal type;
List name; // Name of the bal
List attributes[]; // Array of type struct List
};
bal.cファイルで次のような関数を使用しようとしているとき:
Bal createBal(List name){
char * search;
const char toFind = '=';
search = strchr(name->value, toFind);
}
この行でエラーが発生しています:search = strchr(name->value, toFind);
saying:error:不完全な型へのポインターの逆参照
bal.cにlist.hをすでに含めている理由がわかりません
Stackoverflowをよく読んで、プログラミングのタイプは「不透明(OPAQUE)」と呼ばれています。これは本当に素晴らしいようですが、他のヘッダーファイルを他のソースファイルに使用する方法がわかりません。bal.cファイルにlist.hを含めるだけでいいと思いました。
私はこのcommmdを使ってgccでコンパイルしています: gcc -g -W -Wall -c bal.c bal.h
どうもありがとうございます !
ヘッダーファイルをインクルードするときは、それだけです。ヘッダーファイルには、次の行のみが含まれています。
typedef struct list * List;
mainからこの構造体を使用しようとすると、コンパイラーは不完全な型について文句を言います。これは、ソースファイルの観点から、この構造体にはメンバーがないためです。実際、それはまったく定義されていません。
あなたが置く必要があります:
struct list;
typedef struct list * List;
ヘッダーファイル内。ただし、このプロセスでは不透明な構造体が作成されることに注意してください。つまり、例えば
List l1;
l1->data = 0; //error
コンパイラはヘッダーファイルからインクルードされたものだけを見るため、許可されていません。そのコンパイルユニットでは、構造に変数は存在しません。
これは意図的に使用して、ユーザーにデータ型のゲッター/セッターを通過させることができます。何かのようなもの
int data = ListStuff_Get_Item1(l1);
実行できますが、ListStuff_Get_Item1()関数を.hで宣言し、.cで定義する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加