6

很难为这个问题想出一个合适的标题。反正...

我目前正在为SDL中的游戏开发GUI。当一个奇怪的错误出现时,我已经完成了软件绘图,并且正在开始使用它的 OpenGL 部分。我包含了“SDL/SDL_opengl.h”头文件并编译。它抛出“错误C2039:'DrawTextW':不是'GameLib::FontHandler'的成员”,这是一个足够简单的错误,但我没有任何称为DrawTextW的东西,只有FontHandler::DrawText。我搜索 DrawTextW 并在标题“WinUser.h”的#define 调用中找到它!

//WinUser.h
#define DrawText DrawTextW

显然它用 DrawTextW 替换了我的 DrawText!我怎样才能阻止它像那样溢出到我的代码中?

更改我自己的函数名称是一件小事,但是像这样的命名冲突似乎很危险,我真的很想知道如何一起避免它们。

干杯!

4

4 回答 4

11

你有几个选择,所有这些都很糟糕。

  • 添加#undef DrawText自己的代码
  • 不包括windows.h. 如果另一个库为您包含它,请不要直接包含它。相反,将其包含在单独的 .cpp 文件中,然后可以在其标头中公开您自己的包装函数。
  • 重命名您自己的DrawText.

如果可能,我通常会选择中间选项。windows.h在无数其他方面表现不佳(例如,除非您启用 Microsoft 的专有 C++ 扩展,否则它实际上不会编译),所以我只是像瘟疫一样避免它。如果我能提供帮助,它不会包含在我的文件中。相反,我编写了一个单独的 .cpp 文件来包含它并公开我需要的功能。

此外,请随时在 connect.microsoft.com 上将其作为错误和/或反馈提交。Windows.h 是一个设计糟糕的头文件,如果人们引起微软的注意,他们有朝一日修复它的可能性很小。

好消息是,这windows.h唯一表现不佳的标头。其他头文件通常会尝试在其宏前加上一些特定于库的名称以避免名称冲突,它们会尝试避免为常用名称创建宏,并且会尝试避免使用不必要的宏。

于 2009-07-03T20:22:09.540 回答
5

#include这是ing的一个不幸的副作用<windows.h>。假设您实际上并没有在程序中的任何地方使用 Windows ,那么在以下情况下立即使用DrawText()它是完全安全的:#undef

// wherever you #include <windows.h>, or any other windows header
#include <windows.h>
#undef DrawText
于 2009-07-03T19:56:24.667 回答
4

没有一般的方法可以避免这个问题——一旦你使用预处理器#include 一个头文件,它就可以重新定义它喜欢的任何名称,而你对此无能为力。您可以#undef 名称,但前提是您知道名称首先是#defined。

于 2009-07-03T19:56:29.130 回答
0

只是#undef你不想要的符号。但请确保windows.h在包含 SDL 之前包含并执行此操作:

#include <windows.h>
#undef DrawText

#include <SDL/SDL_opengl.h>
于 2009-07-03T20:04:17.087 回答