2013-05-13 154 views
-1

我已經讀了很多這個問題,但我還沒有找到一個合適的解決方案。 所以我有4個文件:包括error.Functions已經聲明

includes.h - which contains all libraries I need in other files + some global functions 
cities.h - which contains declarations of 2 classes 
cities.cpp - which contains definitions of the 2 classes in cities.h 
source.cpp - where is the main functon 

我有(和需要),這些包括

//cities.h 
#include "includes.h" 

//cities.cpp 
#include "cities.h" 

//source.cpp 
#include "cities.h" 

我在所有的文件試過#ifndef幾乎所有的組合,程序繼續給我同樣的錯誤:function_X already declared in cities.obj。並且這個錯誤重複「includes.h」中的所有功能。 請幫幫我。這讓我很頭疼。

+0

'includes.h'' #include''cities.h'? – 2013-05-13 21:18:40

+0

是否有任何頭文件定義(而不是聲明)函數? – RichieHindle 2013-05-13 21:19:52

+0

如果您有'cities.h'中定義的函數,請添加'inline'來停止'多個定義錯誤'。同時顯示使用確切的錯誤,它將有助於使用更快的調試。 – andre 2013-05-13 21:22:57

回答

0

正如您在評論中所述,您的includes.h頭文件中有函數定義。當它包含在多個實現文件中時,最終會在程序中定義這些函數的多個定義。這打破了的一個定義規則。您應該簡單地在includes.h中聲明函數並將其定義移至includes.cpp文件中。

事情是這樣的:

// includes.h 

void foo(); 
int bar(int); 


// includes.cpp 

void foo() { 
    // implementation 
} 

int bar(int x) { 
    // implementation 
} 

我要去嘗試,並搶佔通常遵循這個答案的問題。不,你的守衛(#ifndef ...)不是爲了防止這種情況。它們僅防止在單個翻譯單元中多次包含標題。您將標題包含在多個翻譯單元中,其中包含的警衛不會停止。

+0

非常感謝!這很好,感謝你。 – dragonator 2013-05-14 00:27:18

0

在@sftrabbit所說的之上,如果您要製作一個僅包含頭文件的庫,您需要在頭文件中定義這些函數,關鍵字inline可能有此功能。

// includes.h 
inline void foo() { 
    // implementation 
} 

inline int bar(int x) { 
    // implementation 
} 

此使用的inline不被誤認爲與它作爲一個編譯器的建議,inline函數調用其他用途。