2012-04-30 45 views
10

私はKubuntuでKdevelopを使用しています。 私はdatasetup.hファイル構造を宣言している:私は私のmain.cファイルにヘッダーファイル "unknown type"エラーで構造体を使用する

int main() 
{ 
    georeg_val gval; 

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

} 

を、それを使用する場合

#ifndef A_H 
#define A_H 

struct georeg_val { 

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

#endif 

は今、私は次のエラーを取得する:

georeg_chain.c:7:3: error: unknown type name 'georeg_val'

(これはgeoreg_val gval;行にあります)

私はこのエラーを解決します。あなたは新しい型を定義する必要がある場合は、あなたが書く必要が

+0

を宣言しますが、ここで一緒++ CとCを配合していますか? –

+0

ヘッダーをインポートしていることを確認してください: 'import" datasetup.h "'。 – piperchester

答えて

21

は、構造体を宣言するために2つの可能性がありますa struct

struct STRUCT_NAME myStruct; 

あなたは第二の方法を使用する場合は(構造体にとりわけを与えます秒)あなたはstruct識別子を省略することができます - コンパイラが、それはaliasだだけ与えられた変数の型を推測することができます

STRUCT_ALIAS myStruct; 

ボーナスポイント: あなたはそれが名前と別名だの両方で構造体を宣言することができます。

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

その後変数定義では、第1または第2の方法を使用できます。なぜ2つの世界の両方が良いのですか?構造体エイリアスでは、構造体変数の定義を短くすることができます。これは時には良いことです。しかし構造体名はforward declarationsにしましょう。いくつかのケースでは必要不可欠なツールどちらである - あなたは、構造体間の循環参照を持って考えてみます。

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

このアーキテクチャは欠陥があることのほかに - 構造体は、最初の(名前の)方法と構造体で宣言されたときに、この循環定義をコンパイルしますポインターは、structとマークすることで明示的に参照されます。 (この例で、バイナリ検索ツリー構造体)構造体型の定義

6

typedef struct { 

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

その後、新しいタイプとしてgeoreg_val使用することができます。あなたが明示的にマーキングすることにより、変数を定義する必要があります - あなたが最初のメソッドを(構造体に名前を付ける)を使用する場合

struct STRUCT_NAME {} ; 

または

typedef struct {} STRUCT_ALIAS; 

:Cの一

+4

または 'main 'の' struct georeg_val gval; 'に切り替えてください –

+1

@dead_jake main.cのヘッダファイルも'#include'してください – Praetorian

3

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

typedef struct tree treeNode; 

機能例えば:

treeNode *insertElement(treeNode *treeA, int number); 
関連する問題