2016-11-23 14 views
0

私はVisual Studioを使用してCで小さなプロジェクトを開発しています。 複数のインクルードを避けるには、インクルードガードを使用しています。
ファイル:collections.h
エラー:C2061
説明:構文エラー:識別子 '末端'C VS循環依存性?エラーC2061 - 識別子構文エラー

synt_analysis.c

#include <string.h> 
#include "headers\synt_analysis.h" 

私はこの1つを含むエラーの多くを取得しています

synt_analysis.h

#ifndef SYNT_ANALYSIS_H 
#define SYNT_ANALYSIS_H 

#include "collections.h" 

typedef enum { 
    ... 
}TType; 

typedef enum { 
    ... 
}NTType; 

typedef struct { 
    TType type; 
    ... 
}Terminal; 

void push_terminal(Terminal terminal, cStack *stack); 

#endif 

本のcollections.h

#ifndef COLLECTIONS_H 
#define COLLECTIONS_H 

#include "synt_analysis.h" 

typedef union { 
    int error; 
    Terminal terminal; 
    NTType nttype; 
}cItemData; 

typedef struct { 
    char *type; 
    cItemData content; 
}cItem; 

typedef struct { 
    unsigned cap; 
    unsigned used; 
    cItem *items; 
}cStack; 

#endif 

コレクションはsynt_analysisによって定義Terminalを格納することができるcStackを提供します。
synt_analysisはcStack(機能push_terminal)を使用して、Terminalをスタックにプッシュします。この機能は必要なコード量を減らすために存在します(新しいTerminalを作成し、cStackにプッシュします)。

+0

コレクションに#endifはありません。h – stijn

+0

例では忘れてしまいましたが、エラーは解決しません。 –

+0

'#include" synt_anal.h "'は#include "headers \ synt_analysis.h"と同じファイルを含みますか? –

答えて

2

この問題は、前方宣言(コンパイラは不完全なstruct型のサイズを知る必要があります - これはunionの1つのオプションとして使用される必要があります)で単純に解決できないため、解決策は循環依存を破る別のヘッダーファイルを作成することです。

新しいファイルsynt_structures.h

#ifndef SYNT_STRUCTURES_H 
#define SYNT_STRUCTURES_H 

#include "lex_analysis.h" 

typedef enum { 
    ... 
}NTType; 

typedef enum { 
    ... 
}TType; 

typedef struct { 
    TType type; 
    ... 
}Terminal; 

#endif 

synt_analysis.hが含まれています:

#include "collections.h" 
#include "synt_structures.h" 

collections.hが含まれています:サイクルを破る

#include "synt_structures.h" 


を。

+0

私はこれが好きですが、 '#include" lex_analysis.h "は何のためですか? –

0

EDIT:この場合、実際にこの問題は解決されませんが、いくつかの循環依存関係を解決するための便利なテクニックとしてここに残しました。

cStackは、 "synt_analysis.h"内のポインタ型の一部としてのみ使用されるため、そのヘッダーファイル内の不完全な型になる可能性があります。それを不完全な型にするには、それを参照するタグが必要です。不完全型と同じ型を定義

typedef struct cStack { 
    unsigned cap; 
    unsigned used; 
    cItem *items; 
}cStack; 

「synt_analysis.h」において「collections.h」、cStackタイプの定義に使用されるstructにタグを追加で

typedef struct cStack cStack; 

EDIT:前述したように、これは実際にはOPの問題を解決していません。

+0

まだ: 構文エラー:識別子端末--- 構文エラー:識別子nttype --- と別の55エラー –

+0

完全に完全な例を提供できますか? –

+0

正確に何が必要ですか? 私は入れようとしました 'typedef struct Terminal Terminal; typedef enum NTType NTType; typedefを列挙TTYPE TTYPE; ' がcollections.hと ' typedefは構造体CSTACK CSTACKする; ' をsynt_analysis.hそして今、私は1つだけエラーました: 端末は未定義の構造体のターミナルを使用しています(ファイルcollections.h) –

関連する問題