4
gcc 4.4.4 c89

これはヘッダーファイルにあります。

port.h

struct struct_tag;

int initialize_ports(struct_tag *port);

私の実装ファイルにはこれがあります:

port.c

typedef struct struct_tag {
    int port_id;
} Port_t;

そして、私のdriver.hファイルには、次のものがあります。

#include "port.h"
int initialize_ports(struct_tag *port)
{
    port = malloc(sizeof *port);
    /* do checking here */
}

内部要素を非表示にしたいので、構造を前方宣言しました。

ただし、ヘッダーファイルのinitialize_portsで次のエラーが発生します。

expected ‘)’ before ‘*’ token

構造体をパラメーターとして前方宣言して渡すことができるようにするにはどうすればよいのでしょうか。

アドバイスをありがとう、

4

4 に答える 4

8

次を使用する必要があります。

int initialize_ports(struct struct_tag *port);
                     ^^^^^^

また、前方宣言は、サイズがわからない不完全な型を提供します。を割り当てる必要がある場合struct struct_tagは、その完全な定義を含める必要があります。create_struct_tag()または、完全に不透明にしたい場合は、いくつかの関数を使用できます。

于 2010-11-16T11:12:06.143 に答える
6

他の回答が指摘しているように、プロトタイプでに変更することができます。コードをコンパイルするもう1つの方法は、次のように記述することです。struct_tagstruct struct_tag

typedef struct struct_tag struct_tag;

既存の代わりにstruct struct_tag;(つまり、typedefを前方定義と組み合わせます)。それはあなたが書くことを可能にします

int initialize_ports(struct_tag *port)

コンパイルに失敗することなく。ただし、呼び出し元はこのタイプのローカル変数もmalloc()変数も割り当てることができないため、これはまだ完全には望みません。サイズがわからないためです。

他の回答は、構造の定義を開く必要があることを示唆しています。これは一般的に正しい答えではありません。作成しようとしている抽象化レイヤーが削除されるためです。port.c次のような関数(つまり、内部を認識しているライブラリ内)がある方がはるかに優れています。

struct_tag *create_port(...);
void free_port(struct_tag *port)

つまり、構造を作成して解放するため、そして実際に他の操作(構造からの読み取り/構造への書き込みなど)のためにも。

于 2010-11-16T11:35:17.840 に答える
2

「ポート」のサイズがわからないため、エラーが発生します。これは、前方宣言だけであるためです。

要約すると、 "struct_tag"のサイズである定数値も設定しない限り、ここでは前方宣言を使用しないのが最善です...完全に宣言するだけが最善である可能性があります。

于 2010-11-16T11:11:44.727 に答える
2

sizeof演算子は実行時ではなくコンパイル時に評価されるため、次の行で評価されます。

port = malloc(sizeof *port);

コンパイラーは、構造体のサイズに関する情報を持っていません。

ソリューションは次のとおりです。

  • ヘッダーファイルでタイプを完全に定義します。
  • 構造体が完全に定義されたinitialize_ports()、 port.cで定義します。
  • initialize_ports()実行時にのサイズを取得するために、ports.cで定義された関数を呼び出しましPort_tた。

いずれの場合も、コンパイラがorキーワードサポートしていて使用しない限り、ヘッダーファイルdriver.hで定義しないでください。ただし、このような使用法では、コードがISO Cに準拠しないため、移植性が低下します。ただし、C ++のキーワードの標準サポートにより、C ++コンパイルを含むほとんどのCツールチェーンの拡張機能として、コードが見つかる可能性があります。過度に厳格なコンプライアンスオプションを使用しないでください。initialize_ports()inline_inline

ただし、表示されるエラーメッセージは別の理由によるものです。CのC++struct_tagだけでは型を表さないのとは異なり(もしそうなら、typedef!は必要ありませんでした)、structキーワードを使用する必要があります。

于 2010-11-16T11:30:43.530 に答える