【问题标题】:Use macro expansion to create multiple #define constants使用宏扩展创建多个#define 常量
【发布时间】:2013-10-09 00:31:48
【问题描述】:

我正在开发一个开放式 gl 驱动程序,需要使用 #define 定义一组常量。这些常量的名称与它们所代表的值一起迭代。它们还受另一个特定于硬件的#define 设置的最大值的限制。如果可能的话,我想使用最大值来定义这些常量。

目前我对它们的定义如下:

#define GL_MAX_TEXTURE_UNITS 24
#define GL_TEXTURE0  0
#define GL_TEXTURE1  1
...
#define GL_TEXTURE24 24

我想要一些类似以下的东西:

#define GL_MAX_TEXTURE_UNITS 24
#define GL_TEXTURE(SOMETRICKYMACRO)

宏的定义方式使得在编译时我最终得到一个与第一种情况等效的扩展,但如果我想更改常量的数量,我只需要修改 GL_MAX_TEXTURE_UNITS。

【问题讨论】:

  • 这可能是一个愚蠢的问题(我不知道 OpenGL 的深度),但常量必须是 #defined,还是 enum 可以完成这项工作?如果是这样,那么答案会显着改变,您可以使用几种 CPP 元编程“肮脏技巧”中的一种来轻松完成您想做的事情。

标签: c macros c-preprocessor


【解决方案1】:

C 预处理器本身不能生成新的预处理指令。如果您想做这样的事情,您需要使用单独的实用程序(可能是 shell 或 awk 脚本)生成头文件作为构建过程的一部分。

如果您发现自己真的需要这样的东西(以编程方式可变的值范围),这可能表明通过宏名称象征性地引用它们是一个糟糕的设计选择。

【讨论】:

  • 不幸的是,这些常量是 OpenGL 规范的一部分。无法真正避免它们。
  • @Matti Virkkunen 是正确的,设计选择是由 Silicon Graphics 很久很久以前做出的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2015-07-21
  • 2012-04-20
相关资源
最近更新 更多