Visual Studio 将一组函数的 .h 和 .cpp 文件分开
Visual Studio separate .h and .cpp files for a set of functions
我正在尝试适应 Visual Studio 的 c++ 环境,但我遇到了一组函数的问题,我希望将这些函数定义到它们自己的 .h 和 .cpp 文件中。
在我的项目中,有一个包含一些常用变量和定义的文件,名为 "common.h"。
到目前为止,我有一个简单的 main.cpp,我正在尝试分解这些函数以稍微清理我的项目。
.h 文件到目前为止如下所示:
#pragma once
#include "common.h"
void SDLInitGameData();
void SDLCleanUp();
上面 .h 的 .cpp 具有 header 中列出的定义以及一些我想保留 "private" 的辅助函数。
在我的 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。根据我的研究,这是一个 "One Definition Rule" 问题。当我在 makefile 中执行这样的代码时,我会有一条规则来编译 SDLInitialize.h/cpp 文件并使用 main.link 编译它。这似乎在 Visual Studio.
中不起作用
知道我做错了什么吗?
在你的common.h中:
SDL_Window* TGameData::Window = nullptr;
SDL_Renderer* TGameData::Renderer = nullptr;
FPSmanager* TGameData::Manager = nullptr;
包含此头文件的每个翻译单元都将在全局范围内定义这些变量,因此在 link 时会出现重复定义。
相反,您需要将所有这些声明为 extern
,然后在其中一个翻译单元中定义它们。
我正在尝试适应 Visual Studio 的 c++ 环境,但我遇到了一组函数的问题,我希望将这些函数定义到它们自己的 .h 和 .cpp 文件中。
在我的项目中,有一个包含一些常用变量和定义的文件,名为 "common.h"。
到目前为止,我有一个简单的 main.cpp,我正在尝试分解这些函数以稍微清理我的项目。
.h 文件到目前为止如下所示:
#pragma once
#include "common.h"
void SDLInitGameData();
void SDLCleanUp();
上面 .h 的 .cpp 具有 header 中列出的定义以及一些我想保留 "private" 的辅助函数。
在我的 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。根据我的研究,这是一个 "One Definition Rule" 问题。当我在 makefile 中执行这样的代码时,我会有一条规则来编译 SDLInitialize.h/cpp 文件并使用 main.link 编译它。这似乎在 Visual Studio.
中不起作用知道我做错了什么吗?
在你的common.h中:
SDL_Window* TGameData::Window = nullptr;
SDL_Renderer* TGameData::Renderer = nullptr;
FPSmanager* TGameData::Manager = nullptr;
包含此头文件的每个翻译单元都将在全局范围内定义这些变量,因此在 link 时会出现重复定义。
相反,您需要将所有这些声明为 extern
,然后在其中一个翻译单元中定义它们。