我知道这是一个常见问题,但是我很确定我包含文件的方式没有错误。
我会给你基本文件。
Main.cpp:
#include "GameState.h"
#inlcude "Timer.h"
int main ( int argc, char** argv ) {
GameState.h:
#pragma once
#include "Character.h"
Character.h:
#pragma once
#include "Setup.h"
Setup.h:
#pragma once
#include "SDL.h"
#include "SDL_main.h"
#include "SDL_image.h"
错误报告:
Error 1 error LNK2005: "void __cdecl apply_surface(int,int,struct SDL_Surface *,struct SDL_Surface *,struct SDL_Rect *)" (?apply_surface@@YAXHHPAUSDL_Surface@@0PAUSDL_Rect@@@Z) already defined in Character.obj C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error 2 error LNK2005: "bool __cdecl init(struct SDL_Surface * &)" (?init@@YA_NAAPAUSDL_Surface@@@Z) already defined in Character.obj C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error 3 error LNK2005: "bool __cdecl load_files(struct SDL_Surface * * const)" (?load_files@@YA_NQAPAUSDL_Surface@@@Z) already defined in Character.obj C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error 4 error LNK2005: "struct SDL_Surface * __cdecl load_image(char *)" (?load_image@@YAPAUSDL_Surface@@PAD@Z) already defined in Character.obj C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error 6 error LNK1169: one or more multiply defined symbols found C:\Users\Jim\Documents\C++\herorpg\Debug\herorpg.exe
我所包含的内容有什么问题吗?如果您认为需要更多信息,我将发布完整代码。以前似乎只是一个令人讨厌的事情。
最佳答案
C ++有一个称为“一个定义规则”的规则。除其他事项外,该规则指定在您的程序中不能有一个函数的多个定义。您不能同时定义一个函数的两个翻译单元,否则会违反此规则。您可以将翻译单元视为.cpp
文件,其所有标头都包含在适当的位置。
因此,如果您有一个头文件foo.h
,则如下所示:
#ifndef FOO_H
#define FOO_H
int foo() { return 5; }
#endif
然后,将此标头包含在两个或多个
.cpp
文件中,每个翻译单元将具有自己的定义。这违反了一个定义规则。要解决此问题,您的标头应提供如下函数声明:
#ifndef FOO_H
#define FOO_H
int foo();
#endif
然后,在相应的
foo.cpp
文件中,为函数定义:#include "foo.h"
int foo() { return 5; }
这意味着只有
foo.cpp
转换单元将具有foo
的定义。其他翻译单元中foo
的任何使用都将链接到该定义。一种替代方法是将该函数声明为
inline
,如下所示:#ifndef FOO_H
#define FOO_H
inline int foo() { return 5; }
#endif
之所以允许这样做,是因为每个翻译必须能够看到此类函数的定义才能内联。但是,我不建议全部使用
inline
willy-nilly。关于c++ - #include,C++出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16399955/