[英]Trouble with #include, C++
我知道這是一個常見的問題,但我很確定如何包含文件沒有錯誤。
我會給你基本的文件。
#include "GameState.h"
#inlcude "Timer.h"
int main ( int argc, char** argv ) {
#pragma once
#include "Character.h"
#pragma once
#include "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。
鏈接器錯誤不是由#include
錯誤引起的。 當編譯器找不到某些東西的定義時,通常會發生鏈接器錯誤。 或者,如果它找到多個定義(例如在這種情況下)
檢查您是否與多個SDL庫鏈接,或者您是否在代碼中自己定義了這些函數
可能的原因:
定義頭文件中的函數。 函數應該只在.cpp文件中定義。
循環頭文件包括。 喜歡:啊包括bh,bh包含ch,而ch包含啊有時循環包含不明顯,但確實發生了。 “#pragma once”只能阻止一個頭文件被包含多次,但不能阻止循環包含。 要解決這個問題,可以使用“forward declaration”來替換一些#include語句。
關於前瞻聲明的一些鏈接
http://en.wikipedia.org/wiki/Forward_declaration
http://msdn.microsoft.com/en-us/library/f432x8c6(v=vs.80).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.