包含错误。已声明的函数

时间:2013-05-13 21:17:38

标签: c++ include header-files

我已经阅读了很多这个问题,但我还没有找到合适的解决方案。 所以我有4个文件:

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”中的所有函数重复此错误”。 请帮助我。这让我很头疼。

2 个答案:

答案 0 :(得分: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 ...)并不意味着阻止这一点。它们仅阻止在单个转换单元中多次包含标头。您将标题包含在多个翻译单元中,其中包括后卫不会停止。

答案 1 :(得分:0)

除了@sftrabbit所说的,如果你要创建一个只有头文件库,你需要在头文件中定义函数,这可以使用关键字inline

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

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

inline的这种使用不应与其作为inline函数调用的编译器建议的其他用途混淆。