2013-05-13 113 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函数调用其他用途。