我已经阅读了很多这个问题,但我还没有找到合适的解决方案。 所以我有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”中的所有函数重复此错误”。
请帮助我。这让我很头疼。
答案 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
函数调用的编译器建议的其他用途混淆。