1

I'm creating a large program that's supposed to be simulating a MIPS pipeline. I'm trying to modularize my code as much as possible to keep things simple, but I'm having trouble compiling.

Currently my program contains the files:

  • pipe.c --- Containing main
  • IF.h
  • ID.h
  • EX.h
  • MEM.h
  • WB.h

  • global.h --- containing global #define functions

  • reg.h
  • ALU.h
  • control.h
  • dMem.h
  • fBuffer.h
  • parser.h
  • bin.h

I'm new to C programming but I have protected myself against multiple includes using #ifndef, #define, #endif in every header file. My problem is that when I compile I get errors claiming: "previous implicit declaration of..."

Many of the header files are used by multiple files, so I'm not sure if this is the issue. Is there some sort of big thing that I'm missing?

4

1 に答える 1

2

暗黙的な宣言は、ヘッダーで宣言されていないものがあったことを意味します(代わりに、コンパイラーは単に関数を見つけました)。以前の暗黙的な宣言は、「生の」関数 (または、Doug がコメントで示唆しているように、同じ名前の別の関数) の暗黙的な宣言を想定した、後で宣言に出くわしたことを意味します。

これにはいくつかの方法があります。

  • 関連ファイルにヘッダーが含まれていない可能性があります。含まれIF.cませんIF.h。コンパイラはIF.c暗黙の定義を読み取って作成します。後で別の場所を読み取るIF.hと、このエラーが発生します。

  • 関連するヘッダーを含まないファイルで関数を使用している可能性があります。IF.hを定義しているかもしれませんが、 inmyfunction()を使用し、そこには含めません。そのため、コンパイラは、 inに含まれている場合、in の定義を見る前にinの使用を認識します。myfunction()dMem.cIF.hmyfunction()dMem.cIF.hIF.c

  • ヘッダー ファイルがまったくない場合は、相互再帰関数を使用してこれを取得できます。Cで関数をソートする方法を参照してください。「関数の以前の暗黙的な宣言がここにありました」エラー

  • Doug が提案したように、同じ名前の 2 つの関数を定義します (ヘッダーに定義はありません)。

基本的に、どこかで、何らかの形で、コンパイラは、関連する宣言を含むヘッダーに到達する前に関数に到達しました。ヘッダーが見つかったときに、物事がめちゃくちゃであることに気付き、エラーが生成されました。

(ヘッダーエラーの典型的な原因の1つは、「ifdefs」をあるファイルから別のファイルにカットアンドペーストし、名前を変更するのを忘れていることです...)

[あなたの質問をもう一度読んで、ヘッダー ファイルのみをリストしたと思いました。しかし、今ではそれがすべてのファイルであることがわかりました。ソース ファイルよりも多くのヘッダーがあるのはなぜですか? 通常、各ソース ファイルは、定義する関数の宣言を含む 1 つまたは 2 つのヘッダーに関連付けられています (ただし、サポートに必要な他のものをインポートする可能性があります)。これはコンパイラ エラーとは関係ありませんが、ソースを分割する必要があるようです。また、私があなたを誤解しているか、ヘッダーの通常の使用方法を誤解していることも示唆しています。]

于 2012-08-13T00:28:34.313 に答える