2014-04-04 73 views
0

以雙下劃線開頭的標識符爲reserved in C爲什麼在宏中使用保留名稱(以_開頭)?

那麼爲什麼我在代碼中看到很多這樣的標識符,如statement expressions內的Linux內核?

舉個例子,這就是container_of宏:

#define container_of(ptr, type, member) ({ \ 
      const typeof(((type *)0)->member) *__mptr = (ptr); \ 
      (type *)((char *)__mptr - offsetof(type,member));}) 

爲什麼臨時值有叫__mptr這將是一個保留的名字嗎?爲什麼不只是mptr

回答

2

你的例子來自Linux內核。內核是一個特殊的程序。

它的許多頭文件構成操作系統用戶空間SDK的一部分。因此,任何導出到用戶空間的內核頭文件都需要使用實現保留標識符來實現宏實現細節。另外,由於內核無論如何都不使用標準C庫/運行庫,因此它不會與標準C庫頭文件使用的保留標識符發生衝突(除了任何頭文件實際上是內核源代碼本身)。另外,內核源代碼需要編寫並知道許多編譯器實現細節才能正確編譯和運行,因此作者可能會意識到編譯器使用的保留標識符,並且能夠避免與它們發生衝突。

由於這些原因,簡單地寫所有內核宏(不管是否導出到用戶空間)只在內部使用保留標識符可能是最簡單的策略。

1

宏的參數名稱不應與用戶標識衝突,否則宏將無法正常工作。

C中的保留標識符保留用於「實施」使用。所以編譯器,運行時庫等都允許使用它們。人們通常將「實施」一詞表示爲一般的系統。操作系統是系統的一部分。因此,看到系統頭文件和類似文件中使用的保留標識符是正常的。

+0

這意味着我仍然不應該在宏中使用雙下劃線來表示我自己的代碼,對吧?操作系統使用的標識符如何與「用戶代碼」衝突?我通常不會''包含'Linux來源;) –

+0

是的,你不應該。您可能不會包含它們,但是您包含的標準庫標題可能會這樣做。 – cyco130

相關問題