簡體   English   中英

這個C宏是什么意思?

[英]What does this C macro mean?

看一下fm_transmitter源代碼,我遇到了這個經常使用的宏。

#define ACCESS(base, offset) *(volatile unsigned*)((int)base + offset)

我想它的基數和偏移量的總和被轉換為int,然后重新轉換為無符號指針然后再次指針?

此宏提供對以字節為單位的偏移量的訪問。 你可以把它重寫為

#define ACCESS(base, offset) *(volatile unsigned*)&((char*)base)[offset]

只有原始版本通過int類型而不是char*類型進行算術運算。

請注意,使用此宏可能會調用未定義的行為:不保證生成的指針正確對齊,如果數據被寫為除int變體之外的其他類型,則它也違反了嚴格的別名規則。

另外,選擇int進行指針運算是一個非常糟糕的選擇,計算至少應該通過size_tuintptr_t來完成,以保證在轉換為整數類型期間不會截斷指針。 我的重寫版本沒有這個特定問題,但是,兩個版本都存在未定義行為的危險。

最后,正如Olaf在評論中正確指出的那樣,由於此類型的寬度是實現定義的,因此轉換為volatile unsigned*也是一個壞主意。 轉換為volatile uint32_t*可能更適合與硬件通信。

暫無
暫無

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

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