其他的库#define命名冲突

时间:2009-07-03 19:52:34

标签: c++ opengl sdl

很难为这个问题找到合适的标题。总之...

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

//WinUser.h
#define DrawText DrawTextW

显然它用DrawTextW取代了我的DrawText!如何阻止它溢出到我的代码中?

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

干杯!

4 个答案:

答案 0 :(得分:10)

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

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

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

此外,请随时将其作为错误和/或反馈提交至connect.microsoft.com。 Windows.h是一个设计糟糕的标题,如果人们引起微软的注意,那么他们可能有一天(很少)有机会修复它。

好消息是,windows.h唯一标头,表现得非常糟糕。其他标头通常会尝试使用某些特定于库的名称为其宏添加前缀,以避免名称冲突,它们会尝试避免为常用名称创建宏,并尝试避免使用超出必要的宏。

答案 1 :(得分:5)

#include <windows.h>这是一个不幸的副作用。假设您实际上并未在程序中的任何位置使用Windows DrawText(),那么#undef之后立即使用它是完全安全的:

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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

#include <windows.h>
#undef DrawText

#include <SDL/SDL_opengl.h>