簡體   English   中英

定義一個宏以將前綴 0x 添加到十六進制字符串文字

[英]Defining a macro to add the prefix 0x to a hex string literal

我試圖讓一個宏在我的 c 程序中工作,以將0x添加到十六進制文字,如下所示:

#define BUILD ABCD0000

#define CONCAT(m, n) m ## n
#define HEX(x) CONCAT(0x, x)

const uint32_t Id = HEX (BUILD);

我收到此編譯器錯誤:整數常量上的后綴“x”無效。 任何人都可以幫忙嗎?

這不是您期望的答案,但很抱歉,我必須:不要這樣做!!

為什么不 ?

  • 這是誤導性的:名稱和語法HEX(x)導致認為會將 x 轉換為十六進制,而它要求參數已經是十六進制的。
  • 它的行為很糟糕: HEX(ABC00+10)會將第一部分采用十六進制,但第二部分仍為十進制。 為了讓宏在表達式中表現良好,訣竅是將參數的每次使用都括在括號之間,但這對於連接是不可能的。
  • 對於您的同行開發人員來說,這與POLA 背道而馳
  • 最好習慣0x :它出現在那里的很多代碼中,在編譯器消息中,在調試器中,等等......所以訓練你的眼睛而不是試圖逃避。

話雖如此,在 Godbolt 上對幾個編譯器版本進行了測試后,我無法重現您的錯誤。 所以如果你想繼續:

  • 也許您的舊編譯器被間距干擾(刪除宏定義和宏使用中的所有空格)。 或者,它不應該,但誰知道,宏中的兩個x展開?
  • 或者,您的編譯器可能希望宏中使用的每個標記都是有效的(例如,字符串必須關閉,文字有效等......)。 我記得有這樣的限制,但在 80 年代,也許是 90 年代的非常舊的 C 編譯器上*

現在已經解決了。 我讓它在另一個編譯器上工作,然后意識到它實際上為 BUILD 值生成了一個空白,即只是 #define BUILD

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM