2016-12-14 13 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

あなたが言ったように、コンパイラは最初にコンパイルするときにアクセスをチェックします。

ただし、オブジェクトファイルが生成されると、おそらくチェックはありません。実際には#includeヘッダーファイルの前に#define private publicを実行してから、プライベートメンバーにアクセスできます。

いくつかの奇妙なオブジェクトファイル形式やコンパイラフラグのセットがプライベートメンバーの使用を難しくしようとしているかもしれませんが、すべてのメソッドが#defineトリックとして回避するのはほぼ同じですprotectedのメンバーにはpublicのようにアクセスします(派生クラスからアクセス可能である必要があるため)。

+0

'' '' #define private public''''それは悪質なものです。大好きです。 – mascoj

+0

これは通常、良いアイデアではなく、技術的には未定義の動作ですが、実際にはプライベートなメンバーにアクセスするように機能します。 –

関連する問題