[英]How to concatenate and evaluate macro using ## operator
我已经写了这样的交流代码
#include<stdio.h>
#include<stdint.h>
#define CHAN(n) ((0x8020##4+n) ## 20)
void main()
{
int n = any_value;
printf("%x",CHAN(n));
}
我在pasting ")" and "20" does not give a valid preprocessing token
时遇到编译错误, pasting ")" and "20" does not give a valid preprocessing token
。
实际上,我想评估值为n
的表达式。 因此,假设我将n
值传递为1
不是期望输出0x8020520
。 类似地,如果我将n
值传递为8
,则我期望0x8020c20
。
如果我从宏中删除##20
,则没有得到任何编译错误,并且得到预期的一半输出,如0x80205
或0x8020c
我的问题是我无法找到一种在表达式求值后将20连接的方法,即(0x8020##4+n)##20
。 任何帮助将不胜感激。
当您执行(0x8020##4+n)
,它将被解析为以下标记:“(”,“ 0x8020” ##“ 4”,“ +”,“ n”,“)”。
将“ 0x8020”和“ 4”粘贴在一起后,您将得到( 0x80204 + n )
。 粘贴前实际上并没有添加n
。 (怎么可能?预处理器不知道变量是什么,它认为“ n”只是一个长度为1的字符串)
当您执行) ## 20
,您将得到无效的令牌“)20”,这是没有意义的。 因此,它理应引发错误。
似乎您想用n
的值替换一个十六进制数字。 您可以通过按位操作轻松地做到这一点:
#define CHAN(n) (0x8020020 | ((4 + n) << 8))
// ^
(当移位将由(4 + n)表示的单个十六进制数字移动到第二位的值时, |
(按位或)对它将替换指示的0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.