Ripspace
Ripspace

Reputation: 551

Compiler Hiccup in C++ and with .o Files

I've been trying to compile a multi-file project, but every time I try to use a void in player.cpp, I keep getting this error message, which appears that the player.o that is created during compilation has the same definition of void player_action(...). When I tried to use a void in the other files, the same problem occurs, with their corresponding .o file. However, if I use structs in any of the files, no problems occurs, and no "multiple definition" error occurs. In the lines below is the error message the compiler is giving me.

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

This is the code from player.cpp I used:

#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:;
        };
    };
    };
};

What could be wrong and how can I fix it? I'm using Codeblocks with Mingw and Windows XP. I already checked the other files and there aren't any extra definitions of void player_action().

Upvotes: 0

Views: 131

Answers (2)

Pavel Zhuravlev
Pavel Zhuravlev

Reputation: 2791

If you need to access void player_action() from several parts of your program you should make a header file myapi.h which contains the following:

//myapi.h
#ifndef MYAPI_HEADER 
#define MYAPI_HEADER

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

/* more function declarations */

#endif

The file which defines the function will be like this:

//player.cpp

#include "myapi.h"

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

and the file which uses it will be like this:

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

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

Never include objects definitions with #include, unless you know what you are doing. And even if you do know, you should think twice before doing so. Always use include guards (#ifndef ... #define .. #endif) - this will prevent multiple inclusion of your header.

These are the basic recommendations. I have seen a good explanation of such stuff in B. Stroustrup's 'The C++ programming language'

Upvotes: 0

Matt Phillips
Matt Phillips

Reputation: 9691

You never #include .cpp files, rather the .h files only.

Upvotes: 2

Related Questions