2011-12-18 17 views
8

私は、単純なリンクリスト構造を作るために2つの.Cソースファイルで使用される構造体を作成しようとしています。ヘッダーファイルに構造体を作成する時間を節約できると思ったのですが、前に「解析エラーが発生しました」というエラーが出ます。Cヘッダファイル(.h)に自己参照構造体を定義していますか?

/* 
* Structures.h 
* 
* Created on: Dec 17, 2011 
*  Author: timgreene 
*/ 

#ifndef STRUCTURES_H_ 
#define STRUCTURES_H_ 

typedef struct list_struct { 
    int data; 
    struct list_struct* next; 
    struct list_struct* prev; 
} list; 

#endif /* STRUCTURES_H_ */ 

編集を:私はもともと、私は実際にはXMOSツールチェーンからXCCでコンパイルしていますされ、詳細を省略した

これは私が使用しているコードです。私はまだ.hファイルの構文に違いがあることを理解していません。

は、それは私が使用しているコンパイルフラグだろうか?ここで

は、コンソールのプリントアウトです:

xcc -O0 -g -Wall -c -MMD -MP -MF"filter.d" -MT"filter.d filter.o " -target=XC-1A -o filter.o "../filter.xc" 
In file included from ../filter.xc:15: 
Structures.h:13: error: parse error before '*' token 
Structures.h:14: error: parse error before '*' token 
Structures.h:15: error: parse error before '}' token 
+5

あなたのコードは私のために罰金コンパイルします。 (GCC4.5)。 – Owen

+13

アンダースコア "_"で始まる識別子は予約されているため、使用しないでください。 –

+2

コードは正しいです。エラーは他の場所にあります。 –

答えて

10

はXMOSのドキュメントのいくつかで周りを見ると、問題はそのようですXCはCではなく、ちょうどCのような言語です。 「XCプログラミングガイド」から:

XCはC、ポインタのサポート ている主な不作為と同じ機能の多くを提供します。

...あなたの構造内にnextprevポインタを受け入れない理由を説明しています。

どうやらXCCはあなたがCコードに構造の使用を制限した場合、それが動作するはずですので、あなたが、しかし、CおよびXCソースをミックスすることができます。 "XCCコマンドラインマニュアル"から、.xc拡張子を持つもの(上記のコマンドラインのようなもの)は、デフォルトでソースコードではなくXCとして扱われます。これは、コマンドラインでCソースの前にオプション-xcを置き、-xの後に(またはファイルの名前を.cの名前に変更するだけで)上書きすることができます。

でCではなくXCを使用する必要がある場合は、別の方法(配列、多分?)を見つける必要があります。

+0

ああ、うわー!これは私の側で恥ずかしい欠点です、ドミトリー親切に感謝!私は最後の1時間ほどで非常に屈辱を感じます... –

+0

また、同じ問題で苦労している人のために、ヘッダーファイルを使ってXCに通常のCコードを含めるのは簡単です。したがって、.xcからデータ構造要件を外注してください可能であれば、.xcモジュールで使用されているヘッダーファイルにポインタを定義しないでください。そうしないと、あなたは馬鹿に見えます。 –

1

struct list_structの前方宣言を使用してみてください:

struct list_struct; 
typedef struct list_struct { 
    int data; 
    struct list_struct* next; 
    struct list_struct* prev; 
} list; 

おそらく、あなたのコンパイラは、私は、独自の定義の途中で識別子を認識しませんそれについての標準が何に言いそうかは分かりません。まだ知らない人のために

が、これもstruct定義における循環依存に対処する方法です:

struct a; 
struct b; 

struct a { 
    int x; 
    struct b *y; 
}; 

struct b { 
    int x; 
    struct a *y; 
}; 
+2

OPのコードは完全に標準に準拠しています。コンパイラがそれをサポートしていない場合は、コンパイラを破棄する必要があります。 –

+0

-1あなたの循環依存関係の例は、正当なCコードであれば、無限大の型を作成します。 'sizeof(struct a)'は何を返しますか? –

+0

ええ、ポインタを意味します。修正しました。 – Kevin

関連する問題