2013-04-13 15 views
0

首先,代码段我有问题;处理链接错误与辅助.cpp和.h

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 //只是重要part..i没有福尔戈由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的所有设置,并将函数定义放入头文件,但这是我的一个缩写。

我需要什么:显然更多关于标题和辅助.cpp文件的理解......并可能链接。我有几本书;由凯利编写的“编程2D游戏”,由海港开始的“开始游戏编程”,以及由霍顿编写的“visual C++ 2010”。有人可以指点我一个地方的方向来更详细地学习我的问题,当声明生活在标题中时,获取.cpp中的函数,或者推荐一本能教会我理解这些问题的书吗?

解决方案编辑:幸得垫皮特森(见注释)

的代码

解决方案结束了;

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

回答

0

名称WINDOW_HEIGHTWINDOW_WIDTH可能用作Windows环境中的宏或其他名称。使用全部使用大写字母名称的变量通常是一个坏主意,因为这是宏的惯例,所以意外地与某个您甚至不知道的头文件中定义的某个宏相冲突的可能性很大更大。

我建议你改变你的变量名,使他们不冲突 - 简单的方式做到这一点是使用小写的名字,window_heightwindow_width

+0

我想你提示,相同的错误和问题,我在2中提到的lnk 2005错误更具体地说是错误LNK2005:“int window_width”(?window_width @@ 3HA)已经在settings.obj中定义了 – Okari

+0

这听起来像你在编译和链接相同的源码两次,我认为这是因为你应该在名称前面加上'extern',然后在'settings.cpp'(不带'extern')中再次声明相同的名字。否则,您会为包含标题的每个源文件获取一个变量副本,这不是您想要的。 –

+0

当然,你有两个副本的事实也是你的代码出错的原因,因为'main'正在读取“错误的副本”。我会回来编辑一下答案,但我现在要吃点早餐了...... –