2013-04-13 56 views
2

我工作的一臺掃描儀/解析器一所大學的項目,我碰到的這個錯誤:功能的多定義,這裏先定義

stack.c 91: multiple definition of '[all functions in stack.c]'
stack.c 91: first defined here

出於某種原因,我不能似乎弄清楚編譯器似乎告訴我,我已經在同一個地方多次定義了相同的函數。

我被給了一些框架代碼和一個makefile以開始,所以我自己寫的文件(stack.c,stack.h)和其他代碼之間必須存在某種不正確的通信。

我已經一直在移動#包括和混亂的製作文件超過一個小時,現在只是跑到更多和莫重新發布。應該如何設置?

stack.cstack.h是我寫的用於symtab.csymtab.h的小文件。

+2

你有沒有試過在你的頭文件中放置一個警衛以避免多重定義? – Ganesh

+0

我已經將一個新版本的'stack.h'粘貼爲http://pastebin.com/pxTVFJMM。請嘗試使用此版本並分享您的結果? – Ganesh

+0

可能重複http://stackoverflow.com/questions/685439/multiple-definition-of-c-compiler-error – Ganesh

回答

5

symtab.h,你是#include ing源文件stack.c。不要這樣做,多重定義問題應該消失。

+0

如果我不包含stack.c,那麼我會收到與在symtab.h和symtab.c中使用的stack.c和stack.h中定義的類型有關的錯誤: – user1743798

+1

@ user1743798:不應在源頭文件中包含源文件文件。你不應該在源文件中包含源文件。您可以將頭文件包含在頭文件中,但要確保它們能夠妥善防範多重包含。 – jxh

+0

我按照你的建議編輯了我的文件(總是想知道應該包括什麼,謝謝),但是我的symtab.h現在抱怨在stack.h和stack.c中定義的類型。 – user1743798

1

我終於得到了(看似)工作。作爲user315052,我從.h文件中刪除所有#includes,並將其放入.c文件中。然後我從symtab.h收到關於在stack.h中定義的類型的錯誤,所以我在symtab.h中包含了stack.h,它似乎現在可以工作(或者至少是編譯)。

+1

您不必從頭文件中刪除#includes。規則1)在所有頭文件周圍放置守衛(或者只使用#pragma一次 - 現在每個人都讚不絕口)。規則2)在每個文件,頭文件或源文件中,包含定義該文件使用的類型或其他全局變量的頭文件。這是合乎邏輯的,它是有效的,並且是按照各種軟件組成原理的正確方式。 –