使用辅助.cpp和.h处理链接错误

时间:2013-04-13 22:21:07

标签: c++ header lnk2005

首先,代码片段我遇到了问题;

settings.h

   namespace
{
int WINDOW_WIDTH;
int WINDOW_HEIGHT;
bool FULLSCREEN;
}

void settings_init();

settings.cpp

#include "DX_Constants.h"

void settings_init()
{
 WINDOW_WIDTH = 1920;
 WINDOW_HEIGHT = 1080;
 FULLSCREEN = true;

}

main.cpp //只是重要部分..我没有忘记winapi所需的其他部分

#include "settings.h"

int WINAPI WinMain(...)
{
settings_init();

if(//verifies values entered are seen here correctly ...NOTE triggers on != )
return false;


....code continues
}

我的问题:

  1. 以此格式运行代码会触发if语句检查并关闭程序。

  2. 如果我删除匿名命名空间,我会得到变量的LNK 2005错误。

  3. 如果我只是注释掉所有settings.cpp并将函数定义放入头文件中,我可以获取代码运行,但这是我的简短说明。

  4. 我需要什么:显然对标题和辅助.cpp文件有更多的理解......可能还有链接。我有几本书;由凯莉编写的“编程2d游戏”,由港口“开始游戏编程”,以及由horton编写的“visual C ++ 2010”。有人能指出我在一个地方的方向,更详细地学习我的问题,这是在声明生活在标题中的时候让函数生活在.cpp中,或者推荐一本能教会我理解这些问题的书吗? / p>

    解决方案编辑:来自Mats Petersson(见评论)

    代码的解决方案最终成为了;

    1. 删除匿名命名空间和括号。
    2. 在settings.h中的全局变量类型声明前面应用extern前缀。
    3. 将正常的全局变量声明(例如int window_width;)添加到settings.cpp文件中。

1 个答案:

答案 0 :(得分:0)

名称WINDOW_HEIGHTWINDOW_WIDTH可能在Windows环境中用作宏或其他名称。使用所有大写名称的变量通常是一个坏主意,因为这是宏的约定,因此与某些你甚至不知道的头文件中定义的某些宏意外冲突的可能性很大更大。

我建议您更改变量的名称以使它们不冲突 - 这样做的简单方法是使用小写名称,window_heightwindow_width等。