gpt4 book ai didi

c++ - 如何使用算术生成预处理器定义?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:14 25 4
gpt4 key购买 nike

我想动态创建预处理器文字字符串,其中字符串的一部分是通过某种算术创建的,例如:math(x) x - 0x1234。生成的定义将由宏生成:get_tex_uniform_name(unit),结果将与以下按数字顺序定义的值相同:

// texture uniform naming
#define TEX_UNIFORM_BASE_NAME "tex"
#define TEX_UNIFORM_0 TEX_UNIFORM_BASE_NAME"0" // "tex0" and so on
#define TEX_UNIFORM_1 TEX_UNIFORM_BASE_NAME"1"
#define TEX_UNIFORM_2 TEX_UNIFORM_BASE_NAME"2"
#define TEX_UNIFORM_3 TEX_UNIFORM_BASE_NAME"3"

我尝试使用 STRINGIFY (#) 从头开始​​生成字符串:

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
// create string literal from whatever is put in
#define STRINGIFY(x) #x
#define LITERAL_STRINGIFY(x) STRINGIFY(x)
#define get_tex_uniform_name(unit) TEX_UNIFORM_BASE_NAME LITERAL_STRINGIFY(get_tex_unit_num(unit))

// issue: result is "texunit - 0x84C0", 0x84C0 being GL_TEXTURE0

我已经尝试使用标记粘贴来处理现有定义:

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
#define get_tex_uniform_name(unit) TEX_UNIFORM_ ## get_tex_unit_num(unit)

// error: TEX_UNIFORM_get_tex_unit_num is undefined

并且一直在尝试让某种位掩码起作用:

#define TEX_UNIFORM_BASE_NAME       "tex "

#define get_tex_unit_num(unit) unit - GL_TEXTURE0
#define get_tex_uniform_name(unit) TEX_UNIFORM_BASE_NAME & (0xffffff00 + (char)get_tex_unit_num(unit))

// error: expression must have integral or unscoped enum type

我知道这可以通过函数或仅使用第一个示例中定义的串联文字字符串来完成。我不一定要寻找我的示例不起作用的原因。我正在寻找一种动态获取这些字符串的方法,但在使用宏内部的算术来创建字符串文字时遇到了问题。

最佳答案

您的第一个代码示例应该可以运行,因此没有必要在预处理器中将字符串文字粘贴在一起。也是不可能的。

这是不可能的,因为 ## 将两个预处理标记粘贴在一起,结果必须是一个有效的预处理标记。预处理标记是 header 名称、标识符、预处理编号、字符常量、字符串文字、标点符号或单个非空白字符。您不能将两个字符串文字粘贴在一起并删除它们之间的两个引号。但是,通常不需要将它们粘贴在一起;简单地让它们彼此相邻扩展就足够了,因为相邻的字符串文字是连接在一起的。

您的第一个代码示例可以生成类似 "tex""0" 的结果。在预处理之后和分析和翻译(编译)之前,相邻的字符串文字被转换为单个连接的字符串文字。所以不会有任何优先级或其他语法和语义的问题。

关于c++ - 如何使用算术生成预处理器定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55820900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com