2

Cプログラミングの領域に戻ったばかりで、リンカーに関連していると思われる問題が発生しています。

私も初めてcmakeを使用しているので、それが私の欲求不満を増す可能性があります。

コードが使用しようとしているtypedefを含むサードパーティのヘッダーファイルをインクルードしました。このファイルには次の行があります。

typedef struct pcap pcap_t;

だから私のコードは

pcap_t *var;
//later.....
var->fd;// this line throws the error

これは

error: dereferencing pointer to incomplete type

それで、私は別のインクルードファイルを見逃しているだけですか、それともこれはリンカーの問題ですか?私はQtCreatorでこのコードを作成し、cmakeを使用しています。a_tに飛び込んで、インクルードされたヘッダーにあるtypedef宣言を確認することはできますが、「struct a」自体に飛び込んで、それがどこから来ているのかを確認することはできません。

ありがとう

上記のコードを編集して、pcapライブラリを使用していることを反映しました

だから私は私のソースファイルのヘッダーファイルに次の行を含めました

#include <net/bpf.h>
#include <pcap/pcap.h>

したがって、これら2つのインクルードの間に、pcap構造の定義が欠けていると思います。どこで見つけることができますか?

ありがとう

4

1 に答える 1

4

typedefステートメントは2つのことを行います。タイプの何かの存在を宣言しstruct aます。a_tまた、それがのエイリアスであることも宣言しstruct aます。サイズを決定するための情報なしで型の存在を宣言することは、C言語によって不完全な型と呼ばれます。宣言は、口語的に前方宣言と呼ばれ、型は、型の定義を決して見ることができないコードの部分に対して口語的に不透明と呼ばれます。

typedef struct a a_t;
a_t *var;

C言語では、不完全な型へのポインターを定義できます。型へのポインタはvoidポインタと同じサイズであるため、不完全な型へのポインタ自体は不完全ではありません。ただし、コードはポインタを逆参照しようとします。

var->member;

使用可能な定義がないためstruct a、コンパイラーはプログラムでエラーを検出し、それについて通知しています。これはリンカーの問題ではありませんが、プログラムのセマンティックエラーです。

不透明(OPAQUE)型は、型のユーザーから実装の詳細を隠す方法です。つまり、これはCのインターフェースを提供する方法です。

typedef struct a a_t;

a_t *a_create ();
void a_destroy (a_t *);
int a_get_member (a_t *);
void a_set_member(a_t *, int);

次に、コードでインターフェイスを使用する必要があります。

a_t *var = a_create();
a_set_member(var, 10);
int m = a_get_member(var);
a_destroy(var);

インターフェイスを実装するソースファイルは、実際にはどのようstruct aに見えるかを定義します。デバッガーで参照する定義がないと言ったので、これはプログラムのどこにも定義を提供しなかったことを意味している可能性があります。

編集:パケットキャプチャライブラリを使用しようとしているようです。<pcap.h>コードにヘッダーファイルをインクルードし、とリンクする必要があります-lpcap。ヘッダーファイルまたはライブラリが存在しない場合は、OSのパケットキャプチャ開発パッケージをインストールする必要があります。はすでに<pcap.h>typedefを作成してpcap_tおり、意図的に不透明になっています。したがって、必要な情報にアクセスするには、ヘッダーファイルで定義されているインターフェイスを使用する必要があります。

于 2012-07-07T16:31:59.577 に答える