c++ - 别人的库#define命名冲突

标签 c++ opengl sdl

很难为这个问题想出一个合适的标题。无论如何...

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

//WinUser.h
#define DrawText DrawTextW

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

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

干杯!

最佳答案

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

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

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

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

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

关于c++ - 别人的库#define命名冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1080635/

相关文章:

c++ - 使用 cout (C++) 打印未初始化的 bool 值

c++ - 无法在 SDL2 (MAC M1) 中正确渲染三角形

opengl - SDL 多重采样和 OpenGL

c++ - 将项目移植到我的笔记本电脑会导致黑屏

c++ - 32 位和 64 位无符号整数的移位

c++ - 使用 LASlib 时重新定义 BOOL typedef

c++ - 检查是否支持 DirectX 或 OpenGL

java - LibGDX - 基本的 2D 光照,不知道该怎么做

c++ - OpenGL 截掉部分屏幕

c++ - 混淆 myClass ** p1 和 myClass *p2[5]