【问题标题】:How to generate a valid include statement using C++ macro pre-processor?如何使用 C++ 宏预处理器生成有效的包含语句?
【发布时间】:2016-09-24 22:47:22
【问题描述】:

除了最佳实践之外,是否可以制作一个 C++ 预处理器宏,该宏会生成一个有效的 #include 语句,稍后会导致包含一个文件?

示例

#define MY_INCLUDE magic_goes_here

MY_INCLUDE
//This would be substituted with #include "somefile.h" and then later evaluated to include that file

用例

您可能想知道,这是我的用例:

我想遵循DRY principle 并且只指定 OpenGL 版本和配置文件以在我的代码中使用 ONCE。不幸的是,我的平台(Qt5)无法将 OpenGL 版本和配置文件指定为变量,因此我求助于宏来确保正确的类被重载,正确的参数被传递等所有必要的样板代码设置Qt5 中的 OpenGL。

但是最后一点头痛仍然存在:

#include <QOpenGLFunctions_4_0_Core>

在这种情况下,我想用宏替换 40Core

那么我该怎么做呢?

【问题讨论】:

  • 你不能。 :( ...
  • 实际上在发布后几分钟我就做到了!但仅适用于 "" 而不是
  • 虽然你不能这样做,但你可以将有问题的包含隔离在你自己的头文件中(比如ogl-in-use.h),然后在你的代码中使用它。如果您需要将版本替换为另一个版本,可以在一个地方进行调整

标签: c++ macros include c-preprocessor


【解决方案1】:

考虑在包含特定标头之前使用__has_include
这将允许您根据标头的可用性进行功能测试。

例子:

#if __has_include(<QOpenGLFunctions_4_0_Core>)
#  include <QOpenGLFunctions_4_0_Core>
#  define using_GL_4 1
#elif __has_include(<QOpenGLFunctions_3_0_Core>)
#  include <QOpenGLFunctions_3_0_Core>
#  define using_GL_3 1
#endif

然后您可以使用您定义的宏来了解所包含的 GL 版本。

如果您想根据其他宏有条件地包含文件,您将别无选择,只能考虑每个条件并使用#if/#elif 链。您不能在预处理期间构建标题名称并包含它。

【讨论】:

  • 有这个标准吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2018-01-03
  • 2016-09-16
相关资源
最近更新 更多