首先,代码段我有问题;处理链接错误与辅助.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
}
我的问题:
运行这种格式的代码触发if语句检查,并关闭该程序。
如果删除了命名空间匿名我得到的变量LNK 2005个错误。
我可以得到代码运行,如果我只是注释掉settings.cpp的所有设置,并将函数定义放入头文件,但这是我的一个缩写。
我需要什么:显然更多关于标题和辅助.cpp文件的理解......并可能链接。我有几本书;由凯利编写的“编程2D游戏”,由海港开始的“开始游戏编程”,以及由霍顿编写的“visual C++ 2010”。有人可以指点我一个地方的方向来更详细地学习我的问题,当声明生活在标题中时,获取.cpp中的函数,或者推荐一本能教会我理解这些问题的书吗?
解决方案编辑:幸得垫皮特森(见注释)
的代码解决方案结束了;
- 删除匿名命名空间和支架。
- 在settings.h中的全局变量类型声明前应用extern前缀。
- 将正常的全局变量声明(例如int window_width;)添加到settings.cpp文件中。
我想你提示,相同的错误和问题,我在2中提到的lnk 2005错误更具体地说是错误LNK2005:“int window_width”(?window_width @@ 3HA)已经在settings.obj中定义了 – Okari
这听起来像你在编译和链接相同的源码两次,我认为这是因为你应该在名称前面加上'extern',然后在'settings.cpp'(不带'extern')中再次声明相同的名字。否则,您会为包含标题的每个源文件获取一个变量副本,这不是您想要的。 –
当然,你有两个副本的事实也是你的代码出错的原因,因为'main'正在读取“错误的副本”。我会回来编辑一下答案,但我现在要吃点早餐了...... –