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

这显然不是一个好主意,它在技术上是未定义的行为,但实际上它确实可以访问某些私人成员。 –