2016-12-14 63 views
1

我想知道GCC如何處理C++代碼的控制訪問(public,private,protected)。編譯器(GCC)如何處理C++的訪問控制?

例如

class X 
{ 
public: 
    int a;  
    void funcA(){}; 
private: 
    int b; 
    void funcB(){}; 
protected: 
    int c; 
    void funcC(){}; 
}; 

當然,編譯器會做訪問控制的第一檢查。 但是,我的問題是:

生成彙編代碼(.s文件)或目標文件(.o文件)後,私有變量/函數/對象和彙編代碼中的公共事物之間有什麼區別和ELF文件?

編譯期間編譯器如何設置代碼的控制訪問?

在此先感謝!

+4

沒什麼。訪問修飾符僅在前端處理。一旦代碼轉換成彙編語言或目標代碼,這些東西都不再存在了。 –

+0

爲什麼您認爲訪問控制出現在編譯結果中? –

回答

4

訪問控制嚴格來說是一個編譯時的概念:如果源代碼中的所有訪問都沒問題,那麼代碼就會被編譯。在運行時沒有什麼可以檢查的,所以訪問限定符對生成的代碼沒有任何影響。

1

正如你所說,編譯器會在開始編譯時檢查訪問。

但是,一旦生成目標文件,就可能沒有檢查。其實你可以在#define private public之前,你#include一個頭文件,然後獲得私人成員的訪問權限。

這可能是一些奇怪的目標文件格式或某組編譯標誌將盡力使它更難使用私有成員,但我希望所有的方法都是幾乎一樣容易解決的#define伎倆,特別是對訪問protected成員,就好像它們是public(因爲它們需要可以被派生類訪問)。

+0

'''#define private public''''這是惡魔般的。我喜歡它。 – mascoj

+0

這顯然不是一個好主意,它在技術上是未定義的行爲,但實際上它確實可以訪問某些私人成員。 –