【问题标题】:Other's library #define naming conflict别人的库#define命名冲突
【发布时间】:2010-11-08 00:20:46
【问题描述】:

很难为这个问题想出一个合适的标题。总之……

我目前正在为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!我怎样才能阻止它像那样溢出到我的代码中?

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

干杯!

【问题讨论】:

    标签: c++ opengl sdl


    【解决方案1】:

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

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

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

    此外,请随时将其作为错误和/或反馈提交到 connect.microsoft.com。 Windows.h 是一个设计不良的标头,如果人们引起 Microsoft 的注意,他们有可能有一天会修复它。

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

    【讨论】:

    • 是的,Windows.h 确实发生了冲突。我想抱怨它不编译没有启用 ms 扩展是公平的,但一个特定于 ms 的标头应该(需要这些扩展)也是合理的。
    【解决方案2】:

    这是#includeing <windows.h> 的不幸副作用。假设您实际上并没有在程序中的任何地方使用 Windows 的 DrawText(),那么在之后立即使用 #undef 是完全安全的:

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

    【讨论】:

    • 谢谢!它现在编译得很好。确实很烦人的副作用。似乎 SDL_opengl.h 包含 windows.h,但 #undef 确实有效。 windows.h 是否可以用不同的方式编写来避免这个问题?
    • 可以的。但这需要微软关心。
    • @jalf 你必须在上下文中考虑事情。那个 API 已经有 30 多年的历史了,你希望微软做什么?打破兼容性?有时间看看 Raymond Chen 的博客,你就会开始理解为什么 Windows 编程有时会如此痛苦,以及为什么很多事情不能一蹴而就。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      #include <windows.h>
      #undef DrawText
      
      #include <SDL/SDL_opengl.h>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        相关资源
        最近更新 更多