C語言的一些宏後面會加零,define n+0,為什麼要加零呢?有什麼意義?

小虎哥奇異故事


在閱讀 Linux 內核源碼時,發現了兩個宏,相關的C語言代碼如下,請看:

這兩個宏接收一個結構體參數,該結構體的C語言定義如下:

這兩個宏可以提供“原子操作”級的讀數據操作。一開始看到這個宏的時候,我搞不懂為何要在最後“+0”,不過仔細想想,這麼做至少有兩個好處。

避免被當作“左值”

首先,在 atomic_read() 宏定義後“+0”可以避免 atomic_read() 宏被當作“左值”。根據改宏的名字,應該能夠知道它是“原子的”讀取,而一個被讀取的數據再做“左值”顯然是不合適的,如果沒有後面的 “+0”,下面這樣誤寫的C語言代碼,編譯器是不會報錯的:

當然,也可以使用下面這樣的宏定義避免 atomic_read() 宏被當作左值:

即加上一個“正號”,不過這麼做顯然沒有在後面“+0”好,相信讀者應該明白,這裡就不贅述了。

避免命名重複

按照C語言標準,一個宏只要名字一樣,參數類型一樣,邏輯一樣,出現重複的宏定義時完全沒有問題的,不過出現重複代碼對維護來說是一件很不好的事。在宏後面“+0”的另外一個好處就是可以儘可能的避免重複的宏定義。請看:

在C語言程序中如果無意使用了相同的宏名字,並且相同的宏會被同一環境調用,如果兩個宏連功能代碼也相同,編譯器不做報錯處理,以後就需要維護相同的多份C語言代碼了。+0 可以在一定程度上避免這種情況的發生。


分享到:


相關文章: