2016-07-03 8 views
0

プロジェクトをコンパイルすると次のエラーが発生します。Cでコンパイルすると、ヘッダファイルにインポートエラーが発生する

./PC.h:15:12: error: unknown type name 'InstructionMemory' 
PC *new_pc(InstructionMemory *memoria); 
     ^
./PC.h:17:1: error: unknown type name 'InstructionMemory' 
InstructionMemory *get_memory(PC *programCounter); 
^ 
2 errors generated. 
In file included from main.c:5: 
./InstructionRegister.h:7:36: error: unknown type name 'BankRegister' 
int opera(InstructionRegister *IR, BankRegister *bank); 

しかし、これは私が理にかなっていないが、私は、ファイルを見て、彼らはヘッダファイルですので、私はあなたがヘッダファイルにする#includeを使用することはできませんことを知っています。だから私は何が間違っているのか分からない。

私PC.hファイルの内容があります:

typedef struct PC PC; 
PC *new_pc(InstructionMemory *memoria); 
int getpc(PC *programCounter); 
InstructionMemory *get_memory(PC *programCounter); 
char *fecth(PC *programCounter); 
char *linea_actual(PC *programCounter); 

私はコンパイルするために、次のmakefileを使用します。

CC = gcc 
CFLAGS=-I 
DEPS = ALU.h InstructionRegister.h Rebasing.h BankRegister.h MemoryInstruction.h ControlUnit.h PC.h 

run: exect 
    ./exect $(EX) 

%.o: %.c $(DEPS) 
    $(CC) -c $< $(CFLAGS) 

exect: ALU.c InstructionRegister.c Rebasing.c BankRegister.c MemoryInstruction.c main.c ControlUnit.c PC.c 
    gcc -o exect InstructionRegister.c Rebasing.c BankRegister.c MemoryInstruction.c main.c ControlUnit.c PC.c -I. 


clean: 
    rm -f *.o 
+1

'PC.h'は、' InstructionMemory'を定義するものをすべて含める必要があります。または前方宣言を使用する –

+1

ヘッダーファイルをコンパイルする必要はありません。 –

+0

"*ヘッダファイルに#includeを使用できないことを知っています*" - そうです。 – melpomene

答えて

0

ので、私はあなたがヘッダファイルに#includeを使用することはできませんことを知っています。

あなたは間違っています。ヘッダーファイルには、複数のinclude directivesを使用できます。

典型的な小さなCプロジェクト(例えば、合計で10000行未満のCコード)は、の単一の共通ヘッダーファイルを持つことがよくあります。 myheader.hは、一般的にinclude guardで始まり、

#ifndef MYHEADER_INCLUDED 
#define MYHEADER_INCLUDED 

// some system includes 
#include <stdio.h> 
#include <stdlib.h> 

/// your type declarations 
enum foo_en { /* blablabla */ }; 
struct bar_st { /* blablabla */ }; 
typedef struct bar_st Bar; 
/* etc... */ 

/// your global functions 
extern int myglobfun(int, int); 
/* etc...*/ 

/// your global variables (have only a few of them) 
extern Bar*my_bar; 
/* etc... */ 

#endif /*MYHEADER_INCLUDED*/ 

のようにこれは、プロジェクトを編成するだけで1つの可能性であるので、いくつかのシステムでは、含まれています。一部の人は、多くのヘッダーファイルを持ち、明示的に #includeシステムヘッダーを、すべての翻訳単位(たとえばCソースファイル)のヘッダーの前に置くことを好みます。

共通のヘッダーを1つ使用する利点は、Makefileが簡単にコーディングできることです。また、共通ヘッダーprecompileもあります。欠点は、そのヘッダの任意の変更(例えば、フィールドを共通のstructに追加すること)がmakeにすべてを再コンパイルすることです(小さなプロジェクトでは大したことではありません)。

また、多くのヘッダーファイルがある場合は、include guards(単一の共通ヘッダーの場合、実際には役に立たないけど害はありません)を使用し、複数の包含に関する規律を定義してください。しばしば、ヘッダファイル自体が他の必要なヘッダファイルを含むか、あるいはそれらがインクルードされていることをチェックする。あなたが複数のヘッダを持っている場合は

// file "myheaderone.h" 
#ifndef MYHEADERONE_INCLUDED 

// check that "myotherheader.h" has been included 
#ifndef MYOTHERHEADER_INCLUDED 
#error myotherheader.h should have been #include-d 
#endif 

//// etc 

でまたあなたがmyfirstheader.h

の先頭近く#include "myotherheader.h"をコーディングするかもしれない、あなたは複雑なMakefileを必要とするのではなくthisを参照して、依存関係を生成します。それはいくつかpreprocessor optionsgcc-Mとお友達のようなものを使用しています。

ご参考までに、Makefileが間違っています。 ccをハードコードしないでください(ただし、$(CC)を使用してください)。 sureになり、すべての警告についてGCCにお問い合わせください。&デバッグ情報(例:CFLAGS= -Wall -g)。 make -pを実行してGNU make catalog of rulesについて学んでください。CFLAGS= -Iは本当に間違っています。-I以降はCFLAGS= -I. -Wall -gとなります。には常にの後にディレクトリが必要です。

PS。 gccを使用する場合は、の習慣を常にとって-Wallに渡します。非常に頻繁に(もちろんあなたのケースでは)-Wextra(もっと多くの警告を出すこと、コンパイラの警告はあなたの友人であることを覚えていて、コードがなくなるまでコードを改善してください)、おそらく-g-gデバッガ)。ベンチマークの目的で、コンパイラにoptimize(たとえば、-O1または-O2 -mcpu=native)と尋ねてください。

-H preprocessor optionにご注意ください:添付ファイルをすべて表示するようにgccに依頼しています。場合によっては、翻訳ユニットの前処理された形式を表示したい場合は、gcc -C -Eを使用してください。

+0

私はこれを考慮に入れます、今このコンパイル。ありがとう。 –

関連する問題