在Go 原始碼樹中提供的C 程式碼片段中,您已經注意到斜線(/)和點的使用(·) 在函數名稱和原型中,這引發了對其有效性和意義的質疑。
首先,需要注意的是,該檔案是使用 Go 的內部 C 編譯器編譯的,該編譯器源自 Plan 9 C 編譯器。該編譯器允許在標識符中使用 UTF-8 字符,擴展了 C 標準。
特別是,中點字元 (·) 得到了特殊處理。在編譯期間,它被轉換為目標檔案中的常規點 (.)。然後,Go 連結器將這個點解釋為名稱空間分隔符號。
例如,函式原型 void runtime∕race·Read(int32 goid, void *addr, void *pc);會翻譯為目標檔案符號 T runtime.race.Read。
關於斜杠,它們也會被內部編譯器翻譯為常規的正斜杠 (/)。因此,foo∕baz 變成 foo/baz。
函數名稱中的「·」和「/」字元允許建立巢狀命名空間。在Go語言套件中,空命名空間(以“”表示)可以用作佔位符。它的作用類似於根命名空間,可以在連結過程中動態地替換為真實的命名空間。
導入語句中採用了此機制,其中在導入路徑中指定了空命名空間。在連結期間,空名稱空間將替換為導入包的實際路徑。例如,導入 example“path/to/package/example”會將“.Bar1()”翻譯為“path/to/package/example.Bar1()”。
總之,斜線和點提供的 C 程式碼中的 (·) 用於建立巢狀命名空間,並在編譯期間轉換為標準 C 點和斜線字元。這允許在 Go 語言套件中進行靈活且動態的命名空間管理。
以上是為什麼 Go 原始碼樹中的 C 函數名稱和原型中使用斜線和點?的詳細內容。更多資訊請關注PHP中文網其他相關文章!