2009-07-03 57 views
5

很难想出这个问题的正确标题。无论如何...其他的库#define命名冲突

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

//WinUser.h 
#define DrawText DrawTextW 

显然,它取代了我和DrawTextW DrawText的!我怎样才能阻止它溢出到我的代码呢?

改变我自己的函数的名字是一件小事,但这样的命名冲突看起来非常危险,我真的很想知道如何避免它们在一起。

干杯!

回答

9

你有几个选项,所有这些都闹心。

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

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

此外,随时提交它作为connect.microsoft.com上的错误和/或反馈。 Windows.h是一个设计错误的头文件,如果人们引起微软的注意,他们有一天可能会修复它。

好消息是,windows.h只有标题,表现这很糟糕。其他头文件通常会尝试在它们的宏前添加一些特定于库的名称以避免名称冲突,它们尝试避免为常见名称创建宏,并且尽量避免使用超出必要的宏。

5

这是一个不幸的副作用#include ing <windows.h>。您实际上并不使用Windows' DrawText()在你的程序的任何地方假设,这是完全安全的#undef立刻之后:

// wherever you #include <windows.h>, or any other windows header 
#include <windows.h> 
#undef DrawText 
+0

谢谢!它现在编译好了。确实有一个令人讨厌的副作用。看起来好像SDL_opengl.h包含了windows.h,但是#undef是它的工作。为了避免这个问题,windows.h的写法可能不同吗? – Zoomulator 2009-07-03 20:06:10

+1

它可以。但这需要微软关心。 – jalf 2009-07-03 20:22:40

4

有避免这个问题没有通用的方法 - 一旦你使用#include头文件预处理器,它可以重新定义它喜欢的任何名称,并且你无能为力。你可以#undef这个名字,但是假设你知道这个名字是第一个被定义的。

0

只是#undef你不想要的符号。但是,请确保您有windows.h,做这一点,你有SDL之前:

#include <windows.h> 
#undef DrawText 

#include <SDL/SDL_opengl.h>