繁体   English   中英

如何使用##运算符连接和评估宏

[英]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 ,则没有得到任何编译错误,并且得到预期的一半输出,如0x802050x8020c我的问题是我无法找到一种在表达式求值后将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM