我知道这是一个常见问题,但是我很确定我包含文件的方式没有错误。

我会给你基本文件。

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/

10-11 23:20
查看更多