[英]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.