Visual Studio为一组函数分离.h和.cpp文件



我正试图习惯Visual Studio的c++环境,我有一组函数的问题,我希望定义到自己的。h和。cpp文件。

在我的项目中,有一个包含一些常用变量和定义的文件,名为"common.h"。

到目前为止,我有一个简单的main.cpp,我正试图分解这些函数来清理我的项目。

到目前为止,.h文件看起来像这样:
#pragma once
#include "common.h"
void SDLInitGameData();
void SDLCleanUp();

上面。h的。cpp有在头文件中列出的定义,以及一些我想对这些函数保持"私有"的辅助函数。

到目前为止,我在main.cpp中有如下内容:

#include <iostream>
#include "common.h"
#include "SDLInitialize.h"
int main()
{
    SDLInitGameData();
    system("pause");
    SDLCleanUp();
    return 0;
}
void ReportError(const char* ccpErrorMessage, const TInitializationError xReturnStatus)
{
    cerr << ccpErrorMessage << ": ";
    if (xReturnStatus == SDL_TTF_INIT_ERROR_CODE)
    {
        cerr << TTF_GetError();
    }
    else if (xReturnStatus == SDL_INITFRAMEFRATE_ERROR_CODE)
    {
        cerr << "Unable to initialize FPSManager Object.";
    }
    else
    {
        cerr << SDL_GetError();
    }
    cerr << "n";
    SDLCleanUp();
    exit(xReturnStatus);
}

我的common.h目前看起来是这样的:

#pragma once
#include "SDL.h"
#include "SDL_ttf.h"
#include "SDL2_gfxPrimitives.h"
#include "SDL2_framerate.h"
#include <stdint.h>
#ifdef _WIN32
#include "Windows.h"
#endif
//Program will not compile without this
#ifdef main
#undef main
#endif /* main */
#define SCRN_TITLE "Title"
#define SCRN_WIDTH 640
#define SCRN_HEIGHT 480
#define FPS_CAP 30
struct TGameData
{
    static SDL_Window* Window;
    static SDL_Renderer* Renderer;
    static FPSmanager* Manager;
} gxGameData;
SDL_Window* TGameData::Window = nullptr;
SDL_Renderer* TGameData::Renderer = nullptr;
FPSmanager* TGameData::Manager = nullptr;
enum TInitializationError
{
    SDL_INIT_ERROR_CODE = 1,
    SDL_CREATEWINDOW_ERROR_CODE,
    SDL_CREATERENDERER_ERROR_CODE,
    SDL_INITFRAMEFRATE_ERROR_CODE,
    SDL_TTF_INIT_ERROR_CODE
};
void ReportError(const char* ccpErrorMessage, const TInitializationError xReturnStatus);

我得到了一些LNK2005。根据我的研究,这是一个"一个定义规则"的问题。当我在makefile中执行这样的代码时,我将有一个规则来编译sdlinalize .h/cpp文件并将其与main链接。这在Visual Studio中似乎行不通。

你知道我做错了什么吗?

In your common.h:

SDL_Window* TGameData::Window = nullptr;
SDL_Renderer* TGameData::Renderer = nullptr;
FPSmanager* TGameData::Manager = nullptr;

包含该头文件的每个翻译单元都将在全局作用域中定义这些变量,因此在链接时会有重复的定义。

相反,您需要将所有这些声明为extern,然后在一个翻译单元中定义它们

相关内容

  • 没有找到相关文章

最新更新