2014-01-13 29 views
-4

我知道「public」讓程序員有權訪問成員,屬性或其他類,而「private」不允許訪問。私人和公共訪問如何在編譯期間工作在C++

但我想知道,在編譯(g ++)過程中它是如何工作的?

我嚴重解釋我的問題。 我知道會有什麼效果,我只是想了解更多關於編譯器將執行什麼操作的信息,以及允許公共或私人訪問的操作。

+1

+1 :. Downvoters,請不要苛刻。對於一個好奇心來說,這看起來是一個有效的問題,除了這需要關於編譯器開發的大量細節,並且可能成爲SO的主題。 – Abhijit

+1

@Ahhijit這並不苛刻,但簡單地表達這個問題是不適合的,因爲它是。這將很難解釋和涵蓋編譯器實現必須遵循的有用答案的所有方面。 –

回答

3

當您聲明(或定義)一個對象時,編譯器會創建某種包含該對象屬性的內部記錄。對於C++編譯器,其中一個屬性將描述成員對象的可訪問性。然後,當編譯器遇到試圖訪問成員的代碼時,它會根據可訪問性屬性檢查代碼的身份(類/部分派生類的一部分),以確定是否允許訪問。

雖然這是不可能進行更多的細節,因爲編譯器之間的細節會有所不同。

如果你想對g ++進行一個非常詳細的解釋,那會變得困難和難看。問題是g ++ AST的代碼是(或者至少最初是)用C編寫的,但樹中的節點基本上是多態的。爲了管理它,他們有一個(相當大的)一組宏來模擬類似於C++中的dynamic_cast的東西。每種類型的節點都會被分配一個ID,因此宏會檢查該節點是否包含正確的ID,以表示您嘗試訪問的類型,並允許您訪問數據(如果數據類型正確)。

在這些宏中有許多謂詞宏,可以讓您查詢某個特定節點是否具有某些特定屬性。它已經足夠長,因爲我看我不能它保證它,但如果內存服務其中之一將允許您查詢名稱的可訪問性。

+1

@Laykker這不是一個效果的描述,他告訴你的是它是如何實現的:它歸結爲一個簡單的if。 – Paranaix

+0

哦,是的,明白了! Thx傢伙! – Laykker