簡體   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