2011-12-14 45 views
0

我一直在試圖編譯一個多文件項目,但每次我嘗試在player.cpp中使用void時,我都會收到此錯誤消息,在編譯過程中創建的player.o具有void player_action(...)的相同定義。當我嘗試在其他文件中使用void時,會出現相同的問題,並帶有相應的.o文件。但是,如果我在任何文件中使用結構體,則不會發生任何問題,並且不會發生「多重定義」錯誤。下面的代碼是編譯器給我的錯誤信息。編譯打嗝在C++和.o文件

obj\Debug\player.o: In function `Z13player_actioniii': 
D:/Projects/Blackmail Mailman/player.cpp:13: multiple definition of `player_action(int, int, int)' 
obj\Debug\main.o:D:/Projects/Blackmail Mailman/player.cpp:13: first defined here 

這是player.cpp我使用的代碼:

#include "include_files.cpp" 

struct player_struct 
{ 
    int x; 
    int y; 
int previous_x; 
int previous_y; 
    int mode; 
}; 

void player_action(int x, int y, int mode) 
{ 
    SDL_Event event; 
    if (SDL_PollEvent(&event)) 
    { 
    if (event.type == SDL_KEYDOWN) 
    { 
     switch(event.key.keysym.sym) 
     { 
      case SDLK_RIGHT:; 
     }; 
    }; 
    }; 
}; 

出了什麼問題,我該如何解決?我在Mingw和Windows XP中使用了Codeblocks。我已經檢查過其他文件,並且沒有任何void player_action()的額外定義。

+1

這是什麼意思「使用void」? – 2011-12-14 01:56:44

+0

它意味着使用這樣的東西:void player_action(int x,int y){...}。 – Ripspace 2011-12-14 01:58:24

回答

2

你永遠不會#include .cpp文件,而只是.h文件。

0

如果你需要從你的程序的幾個部分訪問void player_action()你應該做一個頭文件myapi.h其中包含以下內容:

//myapi.h 
#ifndef MYAPI_HEADER 
#define MYAPI_HEADER 

void player_action(int x, int y, int mode); 

/* more function declarations */ 

#endif 

定義函數將是這樣的文件:

//player.cpp 

#include "myapi.h" 

void player_action(int x, int y, int mode) 
{ 
/*...*/ 
} 

和使用它會是這樣的文件:

//main.cpp 
#include "myapi.h" 

void GameCycle() 
{ 
/*...*/ 
player_action(0,0,0); 
/*...*/ 
} 

除非您知道自己在做什麼,否則請勿使用#include包含對象定義。即使你知道,在這樣做之前你應該三思。始終使用包含守衛(#ifndef ... #define .. #endif) - 這將防止多重包含您的標題。

這些是基本的建議。我在B中看到了這樣的東西的一個很好的解釋。Stroustrup的'The C++ programming language'