Me preguntaba cómo maneja GCC el acceso de control (público, privado, protegido) del código C ++.

E.g.

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

Por supuesto, el compilador comprobará el control de acceso al principio. Sin embargo, mi pregunta es:

Después de generar el código ensamblador (archivo .s) o el archivo objeto (archivo .o), ¿cuál es la diferencia entre las variables / funciones / objetos privados y las cosas públicas en el código ensamblador y los archivos ELF?

¿Y cómo establece el compilador el acceso de control para el código durante la compilación?

¡Gracias de antemano!

1
tiger 14 dic. 2016 a las 23:39

2 respuestas

La mejor respuesta

El control de acceso es estrictamente una noción en tiempo de compilación: si todos los accesos en el código fuente están bien, entonces el código se compila. No queda nada para verificar en tiempo de ejecución, por lo que los calificadores de acceso no tienen ningún efecto en el código generado.

4
Pete Becker 14 dic. 2016 a las 21:12

Como dijiste, el compilador comprobará el acceso al compilar al principio.

Sin embargo, una vez que se genera el archivo de objeto, probablemente no se verifica. De hecho, puede hacer #define private public antes de #include un archivo de encabezado y luego obtener acceso a miembros privados.

Puede ser que algún formato de archivo de objeto extraño o algún conjunto de indicadores del compilador intente dificultar el uso de los miembros privados, pero espero que todos los métodos sean casi tan fáciles de solucionar como el truco #define, especialmente para acceder a los miembros de protected como si fueran public (porque necesitan ser accesibles para las clases derivadas).

1
Daniel H 14 dic. 2016 a las 21:16