Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用算术生成预处理器定义?_C++_C_Macros_C Preprocessor_String Literals - Fatal编程技术网

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

C++ 如何使用算术生成预处理器定义?,c++,c,macros,c-preprocessor,string-literals,C++,C,Macros,C Preprocessor,String Literals,我想动态创建pre-processor文本字符串,其中字符串的一部分是通过某种算法创建的,例如:math(x)x-0x1234。生成的定义将由宏生成:get\u tex\u uniform\u name(unit),结果将与以下数字顺序定义的值相同: //纹理统一命名 #定义TEX_统一_基础_名称“TEX” #定义TEX\u UNIFORM\u 0 TEX\u UNIFORM\u BASE\u名称“0”//“tex0”等 #定义TEX_UNIFORM_1 TEX_UNIFORM_BASE_名称

我想动态创建pre-processor文本字符串,其中字符串的一部分是通过某种算法创建的,例如:
math(x)x-0x1234
。生成的定义将由宏生成:
get\u tex\u uniform\u name(unit)
,结果将与以下数字顺序定义的值相同:

//纹理统一命名
#定义TEX_统一_基础_名称“TEX”
#定义TEX\u UNIFORM\u 0 TEX\u UNIFORM\u BASE\u名称“0”//“tex0”等
#定义TEX_UNIFORM_1 TEX_UNIFORM_BASE_名称“1”
#定义TEX_UNIFORM_2 TEX_UNIFORM_BASE_名称“2”
#定义TEX_UNIFORM_3 TEX_UNIFORM_BASE_名称“3”
我已尝试使用STRINGIFY(#)从头开始生成字符串:

#定义get_tex_unit_num(unit)unit-GL_TEXTURE0
//根据放入的内容创建字符串文字
#定义STRINGIFY(x)#x
#定义文字_STRINGIFY(x)STRINGIFY(x)
#定义get_tex_uniform_name(单位)tex_uniform_BASE_name LITERAL_STRINGIFY(get_tex_unit_num(单位))
//问题:结果为“texunit-0x84C0”,0x84C0为GL_纹理0
我已尝试使用标记粘贴来使用现有定义:

#定义get_tex_unit_num(unit)unit-GL_TEXTURE0
#定义get_tex_uniform_name(unit)tex_uniform_35;#get_tex_unit_num(unit)
//错误:TEX\u UNIFORM\u get\u TEX\u unit\u num未定义
并且一直在努力让某种比特屏蔽起作用:

#定义TEX_统一_基础_名称“TEX”
#定义get_tex_unit_num(unit)unit-GL_TEXTURE0
#定义get_tex_uniform_name(单位)tex_uniform_BASE_name&(0xffffff00+(字符)get_tex_unit_num(单位))
//错误:表达式必须具有整数或非范围枚举类型

我知道这可以通过函数实现,也可以通过使用第一个示例中定义的连接文字字符串来实现。我不一定要寻找我的例子不起作用的原因。我正在寻找一种动态获取这些字符串的方法,但在使用宏中的算术来创建字符串文字时遇到了困难。

您的第一个代码示例应该可以工作,因此无需在预处理器中将字符串文字粘贴在一起。这也是不可能的

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


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

我想通过引用一个已经回答了这个问题的问题来为未来的观众总结这个问题:

简言之,如果在评估恒定条件时使用预处理器,则预处理器可以执行算术运算:

#如果1+2==5
#恩迪夫
#否则
#恩迪夫

但是,由于不能将宏与此组合,因此在编译之前不能进行字符串文字定义。

注意:此地址仅用于字符串文字的串联。如果将
单位
扩展为所需字符串文字时出现问题,则未解决该问题。答案的问题.TY中未明确说明该问题。对原来的帖子做了一些更新。我不是在寻找我的示例不起作用的原因,而是在宏中使用算术来创建字符串文字时遇到了问题。@Icster:您将无法在宏中使用算术-预处理器进行文本替换,而不是算术。(它在
#if
#elif
条件下进行算术运算,但在其他条件下不进行运算。)@JonathanLeffler您将常数表达式的求值与@HWalters-hmmm混淆了;我认为常数表达式是算术运算(至少在涉及算术运算符的情况下——这是可以由预处理器计算的表达式可能性的子集。但我只是对发生的事情进行了评论,并给出了一个有用的简洁缩写词,而不是给出一个明确的答案。我觉得需要一个完整的答案才能准确地解释您需要如何进行计算。)在回答问题之前,请先对问题进行细分。宏无法将表达式(即,
0xFFFFFF00-get\u tex\u unit\u num(unit))
)缩减为数字。但是,预处理器可以做到这一点(它需要使用条件指令,而不能在宏中“调用”).宏可以进行数学运算,但这需要宏友好的形式,如
LOGAND((F,F,F,F,F,F,F,0,0),SUB((3),GL_TEXTURE0))
,其中十六进制数被重新表示为
(x,y,z)
(基本上你实现了数学,所以这是一项大量工作)……因此,如果您想要一个实际的、有效的实现,关键是您的问题要尽可能挑剔。因此……基本上,您不能使用宏计算表达式;但是,您想使用预处理器计算表达式,还是使用宏进行算术运算?可能重复“但是因为您无法将宏与此组合”…?(在repl运行(并且可以随意检查)main.sh中;这只是的十六进制版本;这就是我所说的“使用预处理器计算表达式”来解决此问题的意思)。