其他的库#define命名冲突

Zoo*_*tor 6 c++ opengl sdl

很难为这个问题找到合适的标题.无论如何...

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

//WinUser.h
#define DrawText DrawTextW
Run Code Online (Sandbox Code Playgroud)

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

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

干杯!

jal*_*alf 10

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

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

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

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

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


Ada*_*eld 5

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

// wherever you #include <windows.h>, or any other windows header
#include <windows.h>
#undef DrawText
Run Code Online (Sandbox Code Playgroud)