【问题标题】:How to declare a class whose name is already defined in external library?如何声明一个名称已在外部库中定义的类?
【发布时间】:2017-11-03 09:42:01
【问题描述】:

我正在一个使用 OpenGL 的多平台项目中工作,并达到了我需要查询当前上下文的地步。 在 Windows 中,我使用了 wglGetCurrentContext(),包括 windows.h,效果很好。

另一方面,当我尝试在 linux 中编译时,我使用的是 glXGetCurrentContext() 并包括 glx.h,它内部包含 Xlib.h 和 X.h

碰巧在我的源代码中有一个名为 Status 的类,但在 Xlib 中有一个名为相同的宏,即 #define Status int,啊哈!现在是个大问题,因为我到处都在使用我的课程。

解决这个问题的最佳方法是什么?我现在的想法是

  1. 将我的课程重命名为其他名称...但是为什么呢?
  2. 使用#pragma push_macro("Status"),后跟#undef Status
  3. 找到一种更强大、更便携的方式来查询 OpenGL 的上下文

如果您有任何其他建议,请告诉我,我非常感谢。

【问题讨论】:

  • 限制包含 glx.h 的文件数量,然后取消定义宏。不要包含在标题中!
  • 你能把依赖移到一个唯一的文件中吗?在哪里可以安全地#undef Status

标签: c++ opengl glx


【解决方案1】:

至少,您可以将 glXGetCurrentContext() 隔离到它自己的翻译单元中:

myGlXGetCurrentContext.hpp

GLUint myGlXGetCurrentContext();

myGlXGetCurrentContext.cpp

#include<glx.h>
GLUint myGlXGetCurrentContext(){ return glXGetCurrentContext(); }

whatever.hpp

#include<myGlXGetCurrentContext.hpp>
...

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我说的不是宏,而是类。
    • 我的第一个想法是命名空间,但在考虑了这个问题之后,不管是什么命名空间或其他什么,预处理器都会替换名称,所以不,命名空间没有帮助。感谢您抽出宝贵时间回答
    • "但是在 Xlib 中有一个叫做相同的宏"。如果 Xlib 不使用 evil 宏,这将是一个有效的解决方案。
    • 最好的方法是从一开始就为自己的类使用某种前缀。但是现在这导致你必须重命名我们所有的类。
    • @armo 这是一个很好的观点,但有时我们进入开发团队是因为代码在我们进入之前已经开发了很长时间。这也是我第一次遇到这种情况,所以要么我编码不够努力,要么很幸运过去没有遇到这个错误,现在我想我会在未来的项目中听取你的建议;)
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多