15

KubuntuでKdevelopを使用しています。datasetup.hファイルで構造を宣言しました。

#ifndef A_H
#define A_H

struct georeg_val {

    int p;
    double h;
    double hfov;
    double vfov;
};

#endif

main.cファイルで使用すると

int main()
{
    georeg_val gval;

    read_data(gval); //this is in a .cpp file

}

次のエラーが発生します。

georeg_chain.c:7:3:エラー:不明なタイプ名'georeg_val'

(これはgeoreg_val gval;列に並んでいます)

誰かが私がこのエラーを解決するのを手伝ってくれるなら、私は感謝します。

4

3 に答える 3

29

C では、構造を宣言する方法が 2 つあります。

struct STRUCT_NAME {} ;

また

typedef struct {} STRUCT_ALIAS;

最初の方法を使用する場合 (構造体に名前を付ける) - 明示的にマークして変数を定義する必要がありますa struct:

struct STRUCT_NAME myStruct;

ただし、2 番目の方法 (構造体にエイリアスを与える) を使用する場合は、struct識別子を省略できます。コンパイラは、変数の型を推測することができaliasます。

STRUCT_ALIAS myStruct;

ボーナス ポイント:名前とエイリアスの両方で構造体を宣言できます。

typedef struct STRUCT_TAG {} STRUCT_TAG;
// here STRUCT_NAME == STRUCT_ALIAS

次に、変数定義で、最初または2番目の方法を使用できます。2つの世界の両方が良いのはなぜですか?構造体エイリアスを使用すると、構造体変数の定義を短くすることができます。これは、場合によっては良いことです。しかし、構造体名はあなたが作ってみましょうforward declarations。これは場合によっては不可欠なツールです - 構造体間に循環参照があると考えてください:

struct A {
  struct B * b;
}
struct B {
  struct A * a;
}

さらに、このアーキテクチャには欠陥がある可能性があります。この循環定義は、構造体が最初の方法で (名前を使用して) 宣言され、構造体ポインターが としてマークされて明示的に参照されている場合にコンパイルされstructます。

于 2012-04-30T16:14:01.597 に答える
8

新しい型を定義する必要がある場合は、次のように記述する必要があります。

typedef struct {

    int p;
    double h;
    double hfov;
    double vfov;
} georeg_val ;

次に、 georeg_val を新しいタイプとして使用できます。

于 2012-04-30T14:57:05.410 に答える
4

構造体型の定義 (この例では、二分探索木構造体):

struct tree { 
  int info;
  struct tree *left;
  struct tree *right;
} 

typedef struct tree treeNode;

関数の宣言例:

treeNode *insertElement(treeNode *treeA, int number);
于 2013-11-17T04:02:14.180 に答える