謝邀。
在閱讀Linux內核源碼時,發現了兩個宏,相關的C語言代碼如下,請看:
這兩個宏接收一個結構體參數,該結構體的C語言定義如下:
這兩個宏可以提供“原子操作”級的讀數據操作。一開始看到這個宏的時候,我搞不懂為何要在最后“+0”,不過仔細想想,這么做至少有兩個好處。
避免被當作“左值”
首先,在atomic_read()宏定義后“+0”可以避免atomic_read()宏被當作“左值”。根據改宏的名字,應該能夠知道它是“原子的”讀取,而一個被讀取的數據再做“左值”顯然是不合適的,如果沒有后面的“+0”,下面這樣誤寫的C語言代碼,編譯器是不會報錯的:
當然,也可以使用下面這樣的宏定義避免atomic_read()宏被當作左值:
即加上一個“正號”,不過這么做顯然沒有在后面“+0”好,相信讀者應該明白,這里就不贅述了。
避免命名重復
按照C語言標準,一個宏只要名字一樣,參數類型一樣,邏輯一樣,出現重復的宏定義時完全沒有問題的,不過出現重復代碼對維護來說是一件很不好的事。在宏后面“+0”的另外一個好處就是可以盡可能的避免重復的宏定義。請看:
在C語言程序中如果無意使用了相同的宏名字,并且相同的宏會被同一環境調用,如果兩個宏連功能代碼也相同,編譯器不做報錯處理,以后就需要維護相同的多份C語言代碼了。+0可以在一定程度上避免這種情況的發生。