Сбой компилятора в C ++ и .o файлах - PullRequest
0 голосов
/ 14 декабря 2011

Я пытался скомпилировать многофайловый проект, но каждый раз, когда я пытаюсь использовать void в player.cpp, я получаю это сообщение об ошибке, которое показывает, что player.o, созданный во время компиляции, имееттакое же определение void player_action (...).Когда я пытался использовать void в других файлах, возникала та же проблема с соответствующим им файлом .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:;
        };
    };
    };
};

Что может быть не так и как можноЯ чиню это?Я использую Codeblocks с Mingw и Windows XP.Я уже проверил другие файлы, и нет никаких дополнительных определений void player_action ().

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Вы никогда не #include .cpp файлы, а только файлы .h.

0 голосов
/ 14 декабря 2011

Если вам нужен доступ к 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, если вы не знаете, что делаете.И даже если вы знаете, вы должны дважды подумать, прежде чем делать это.Всегда используйте include guards (#ifndef ... #define .. #endif) - это предотвратит многократное включение вашего заголовка.

Это основные рекомендации.Я видел хорошее объяснение таких вещей в книге Б. Страуструпа «Язык программирования C ++»

...