回覆列表
  • 1 # IT劉小虎

    在閱讀 Linux 核心原始碼時,發現了兩個宏,相關的C語言程式碼如下,請看:

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

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

    避免被當作“左值”

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

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

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

    避免命名重複

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

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

  • 中秋節和大豐收的關聯?
  • 描寫星空的優美的詩句有哪些?