2012-08-13 56 views
1

我創建的應該被模擬MIPS流水線大型程序。我試圖儘可能地模塊化我的代碼以保持簡單,但是我在編譯時遇到了問題。模塊化編程(嵌套頭)

目前我的程序包含的文件:

  • pipe.c ---含主
  • if.h中
  • ID.h
  • 實施例H
  • MEM.h
  • WB.h

  • global.h ---包含全局的#define功能

  • reg.h
  • ALU.h
  • control.h
  • dMem.h
  • fBuffer.h
  • parser.h
  • 箱。 h

我是C編程新手,但我已經保護自己免受多種包含使用#ifndef,#define,#endif in每個頭文件。我的問題是,當我編譯我得到的錯誤,聲稱:「以前的隱式聲明......」

很多的頭文件是由多個文件使用,所以我不知道這是否是問題。是否有某種我失蹤的大事?

+0

A *「以前的隱式聲明...」*錯誤通常是由於聲明瞭一個函數兩次。 – 2012-08-13 00:25:10

+0

這些都不是很具描述性的標題名稱,包括臭名昭着的'global.h'。你應該考慮更好的名字,使你的項目更容易理解。 – pmr 2012-08-13 00:31:10

回答

2

聲明意味着是沒有在頭部聲明的東西(而不是,編譯器只是發現功能)。一個以前隱含的聲明意味着,它遇到的聲明後,後承擔一個「原始」功能的隱式聲明(或者,我想,道格提出的意見,並在另一個同名的功能)。

有多種方式可能出現這種情況:

  • 也許你沒有包括相關的文件頭。所以IF.c不包括IF.h。編譯器將讀取IF.c並創建隱式定義。後來,當它在其他地方讀取IF.h時,它會給出這個錯誤。

  • 也許你在不包括相關的頭文件使用的功能。所以也許IF.h定義myfunction(),但您使用dMem.cmyfunction(),不包括IF.h那裏。所以編譯器看到使用myfunction()dMem.c它看到的定義IF.h之前包含在IF.c時。

  • 根本沒有頭文件,你可以得到這與相互遞歸函數。請參閱How to sort functions in C? "previous implicit declaration of a function was here" error

  • 正如Doug所建議的那樣,您定義了兩個具有相同名稱的函數(並且沒有頭中的定義)。

基本上,在某處,編譯器在它到達帶有關聯聲明的頭部之前到達函數。當它找到頭部時,它意識到事情已經搞砸了,併產生了錯誤。

(標題錯誤的一個經典的來源被切斷+粘貼從一個文件中的「的ifdef」到另一個忘記更改名稱...)

[重讀你的問題,我認爲你只上市頭文件。但現在我看到,這是全部您擁有的文件。爲什麼你有比源文件更多的頭文件?通常每個源文件都與一個或兩個包含它定義的函數聲明的標題相關聯(儘管它可能會導入其他需要支持的聲明)。這與您的編譯器錯誤無關,但聽起來也許您需要將源代碼分開。它也表明我或者誤解了你,或者你誤解了標題的典型用法。]