【问题标题】:C++: Maybe you know this pitfall?C++:也许你知道这个陷阱?
【发布时间】:2010-06-18 02:37:46
【问题描述】:

我正在开发一款游戏。我有一个带有两个变量的标题 GameSystem(只是像游戏循环这样的方法,没有类):
int mouseXint mouseY。这些在我的游戏循环中更新。现在我想从Game.cpp 文件(由头文件和源文件构建的类)访问它们。所以,我在Game.h#include "GameSystem.h"。这样做之后,我得到了很多编译错误。当我删除包含时,他当然会说:

Game.cpp:33: error: ‘mouseX’ was not declared in this scope
Game.cpp:34: error: ‘mouseY’ was not declared in this scope

我想在哪里访问mouseXmouseY

我所有的 .h 文件都有由 Eclipse 生成的 Header Guards。
我正在使用 SDL,如果我删除想要访问变量的行,一切都会编译并完美运行 (*)。

希望你能帮帮我……

这是我#include "GameSystem.h" 时的错误日志(他所指的所有代码都有效,如 (*) 所解释的):

在 ../trunk/source/domein/Game.h:14 包含的文件中, 来自../trunk/source/domein/Game.cpp:8: ../trunk/source/domein/GameSystem.h:30:错误:预期的构造函数、析构函数或“*”标记之前的类型转换 ../trunk/source/domein/GameSystem.h:46:错误:变量或字段“InitGame”声明为无效 ../trunk/source/domein/GameSystem.h:46:错误:“游戏”未在此范围内声明 ../trunk/source/domein/GameSystem.h:46:错误:“g”未在此范围内声明 ../trunk/source/domein/GameSystem.h:46:错误:“char”之前的预期主表达式 ../trunk/source/domein/GameSystem.h:46:错误:“bool”之前的预期主表达式 ../trunk/source/domein/FPS.h:46:警告:'void FPS_SleepMilliseconds(int)' 已定义但未使用

这是尝试访问这两个变量的代码:

SDL_Rect pointer;
pointer.x = mouseX;
pointer.y = mouseY;
pointer.w = 3;
pointer.h = 3;
SDL_FillRect(buffer, &pointer, 0xFF0000);

【问题讨论】:

  • 显示相关声明的代码会很有帮助,尤其是错误消息中指定的行。
  • 您可能需要显示有问题的代码 (GameSystem.h)。您显示的错误听起来类似于基本的东西,例如缺少分号,但如果没有看到代码,很难猜到。
  • 一般来说,header 是用于共享的声明,body 是用于定义。在标题中包含正文通常是避免的,因为在多次使用标题时,您不希望编译相同变量/函数的多个定义。内联和模板是一些例外。

标签: c++ sdl


【解决方案1】:

在您的 GameSystem 标头中,不要将这些变量定义为:

int mouseX;
int mouseY;

相反,您应该声明它们:

extern int mouseX;
extern int mouseY;

然后在您的一个 .cpp 文件中定义它们:

int mouseX;
int mouseY;

在头文件中定义它们的问题是编译器会尝试在包含头文件的每个 .cpp 中实例化它们。

【讨论】:

  • 是的,但这不是问题中所有这些错误的原因。
  • 确实有效。非常感谢!但是这样,它们在“.cpp”文件之一中声明。难道没有办法在我的“GameSystem.h”中声明它们吗?
  • @Troubadour:这些错误的发生是因为他停止包含头文件以避免多重定义的原始错误。它被暗示但未在问题中显示,因此有点令人困惑。
  • @Amardeep:啊,好吧。我对这个问题感到非常困惑,因为它清楚地表明这些是包含标题 is 时的错误。干得好! +1。
  • 谢谢;这种现象有名字吗?我在哪里可以了解它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多