如何使用算术生成预处理器定义?
How to generate a pre-processor definition using arithmetic?
我想动态创建预处理文本字符串,其中部分字符串由一些算术创建,例如: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
我知道这可以通过函数来完成,或者仅使用第一个示例中定义的串联文字字符串来完成。我不一定在寻找我的例子不起作用的原因。我正在寻找一种动态获取这些字符串的方法,并且在使用宏中的算术来创建字符串文字时遇到问题。
您的第一个代码示例应该可以工作,因此无需在预处理器中将字符串文本一起粘贴。这也是不可能的。
这是不可能的,因为##
将两个预处理令牌粘贴在一起,并且结果必须是有效的预处理令牌。预处理标记是标头名称、标识符、预处理数字、字符常量、字符串文本、标点符号或单个非空格字符。不能将两个字符串文本粘贴在一起并删除它们之间的两个引号。但是,通常不需要将它们粘贴在一起;只需让它们彼此相邻扩展就足够了,因为相邻的字符串文本是串联的。
生成类似"tex" "0"
的结果的第一个代码示例很好。在预处理之后,在分析和转换(编译)之前,相邻的字符串文本将转换为单个串联字符串文本。因此,不会有优先级或其他语法和语义的任何问题。
我想通过引用一个已经回答这个问题的问题来为未来的观众总结这个问题: C 预处理器可以执行整数算术吗?
简而言之,如果在评估常量条件时使用预处理器,则可以进行算术:
#if 1 + 2 == 5
#endif
#else
#endif
但是由于您无法将宏与此组合在一起,因此无法在编译之前进行字符串文字定义。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 当头文件被预处理时是否有一个预处理器选项显示?