编译器如何区分C ++中的私有和公共数据?

时间:2013-09-27 11:12:33

标签: c++ compiler-construction

例如,

Class Test {
        private:
            int x;
        public:
            int y;
}obj;

现在,可以访问obj.y但不能访问obj.x

我的问题是编译器如何限制对私有数据的访问?

此外,如何在C结构中实现访问说明符?

2 个答案:

答案 0 :(得分:9)

编译器拥有关于翻译单元中所有代码的所有信息(源文件和所有包含的头文件),因此可以跟踪哪些成员是私有的,哪些成员不是。 编译器如何它不相关,不同的编译器可以不同的方式实现它。

私有/公共成员是纯编译时的概念,编译的可执行代码中没有任何内容强制执行它。

答案 1 :(得分:1)

  

我的问题是编译器如何限制对私有数据的访问?

当源代码引用任何变量时,C ++编译器必须进行名称查找才能找到变量(它可以是局部变量,成员变量,全局变量等),并且必须进行访问检查。编译器具有关于类型,变量和范围的所有信息,因此当源代码引用变量时,编译器知道变量是否可访问。如果变量不可访问,编译器将拒绝源代码。

询问“如何”并没有真正有一个合理的答案 - 它是编译器,它就是它的作用。如果你正在尝试编写C代码来做同样的事情,知道它是如何做的对你没有帮助,因为你在程序的源代码中可以做的事情与编译器完全不同。这就像询问飞机如何飞行,然后询问如何乘坐飞机。知道一个人的答案与另一个人无关。

  

此外,如何在C结构中实现访问说明符?

两个选项:

  1. C不支持,使用C ++

  2. 在结构中存储void*,指向某种不透明类型,并且只有“私有”函数(即API的内部)知道该不透明类型的详细信息。

    < / LI>

    这是一个简单的例子

    //
    // in header only "public" data is visible
    //
    
    struct Data {
        int some_number;
        void* private_data;
    };
    
    Data* create_Data(int i, int j);
    void manipulate_Data(Data*);
    
    //
    // in source file, these functions know what the `void*` points to and can use it
    //
    
    struct InternalData {
        int another_number;
    };
    
    InternalData* get_internals(Data* d)
    {
        return (InternalData*)d->private_data;
    }
    
    Data* create_Data(int i, int j)
    {
        Data* data = (Data*)malloc(sizeof(Data));
        data->some_number = i;
        InternalData* internal = (InternalData*)malloc(sizeof(InternalData));
        internal->another_number = j;
        data->private_data = internal;
    }
    
    void manipulate_Data(Data* d)
    {
        data->some_number += get_internals(d)->another_number;
    }