编译器打嗝在C++和.o文件

Compiler Hiccup in C++ and with .o Files

本文关键字:文件 C++ 编译器      更新时间:2023-10-16

>我一直在尝试编译一个多文件项目,但每次我尝试在播放器中使用 void .cpp时,我都会不断收到此错误消息,这似乎在编译期间创建的 player.o 具有相同的 void 定义 player_action(...(。当我尝试在其他文件中使用 void 时,它们对应的 .o 文件也会出现同样的问题。但是,如果我在任何文件中使用结构,则不会出现问题,也不会发生"多重定义"错误。下面的行是编译器给我的错误消息。

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

这是我使用的播放器代码.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的代码块。我已经检查了其他文件,并且没有任何额外的 void player_action(( 定义。

您永远不会#include .cpp文件,而只会 .h 文件。

如果您需要从程序的多个部分访问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的"C++编程语言"中看到过对这些东西的很好的解释。