2010-02-20 19 views
28

He visto el concepto de 'tipos opacos' lanzados un poco, pero realmente no he encontrado una respuesta concisa sobre qué define un tipo opaco en C y lo que es más importante, qué problemas nos permiten resolver con su existencia. Gracias¿Qué define un tipo opaco en C, y cuándo son necesarios y/o útiles?

+13

'FILE' es un buen ejemplo de un tipo opaco en el estándar C. Todo lo que necesita es un objeto 'FILE *' y usa funciones C estándar que operan en él. A usted, como programador, no le importa en qué consiste el tipo 'ARCHIVO'. –

Respuesta

28

Es el más utilizado para propósitos de biblioteca. El principe principal detrás del tipo Opaque en c es usar datos a través de su puntero para ocultar la implementación del manejo de datos. Dado que la aplicación está oculta, puede modificar la biblioteca sin tener que recompilar cualquier programa que dependen de él (si se respeta la interfaz)

por ejemplo: versión 1:

// header file 
struct s; 

int s_init(struct s **x); 
int s_f(struct s *x); 
int s_g(struct s *x); 

// source file 
struct s { int x; } 

int s_init(struct s **x) { *x = malloc(...); } 
int s_f(..) { ... } 
int s_g(..) { ... } 

versión 2

// header file 
struct s; 

int s_init(struct s **x); 
int s_f(struct s *x); 
int s_g(struct s *x); 

// source file 
struct s { int y; int x; } 

int s_init(struct s **x) { *x = malloc(...); } 
int s_f(..) { ... } 
int s_g(..) { ... } 

¡Desde su lado del programa, nada cambió! y como dije anteriormente, no hay necesidad de recompilar cada programa que depende de él.

+0

Supongo que las partes '// implementación' no están separadas del mismo '// archivo de cabecera' y ¿qué van en las bibliotecas? Además, parece que usted declaró 'struct s' en el encabezado, pero nunca lo definió hasta la implementación. Hace poco leí una gran publicación sobre variables 'extern' en C http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c Los conceptos parecen sorprendentemente similares, no debería declararse 'struct s' como 'extern struct s' en tu código de muestra? – SiegeX

+2

usando extern para variable se usa generalmente para declarar variable global (que no está absolutamente relacionada con nuestro caso). Aquí la instrucción struct s; está aquí para indicarle al compilador que existe un tipo llamado struct s. Dado que todas las API en el archivo de encabezado SÓLO usan puntero a esta estructura. No necesita conocer el tamaño de la estructura, sino el tamaño del puntero de la estructura (que está definido por el compilador). Para simplificar, permite que el programa use un objeto usando su dirección (el puntero a la estructura) – Phong

+0

siegeX: Cambié la publicación para evitar la confusión sobre la implementación – Phong

12

En mi comprensión, los tipos opacos son aquellos que le permiten sostener un asa (es decir, un puntero) a una estructura, pero no modificar o ver su contenido directamente (si se le permite, lo hace a través de funciones auxiliares que entienden la estructura interna).

Los tipos opacos son, en parte, una forma de hacer que C esté más orientado a objetos. Permiten la encapsulación, de modo que los detalles internos de un tipo pueden cambiar, o implementarse de manera diferente en diferentes plataformas/situaciones, sin que tenga que cambiar el código que lo usa.

+2

Disculpa: este modismo es * solo * sobre la encapsulación. La encapsulación es necesaria para la orientación a objetos, pero es la parte más pequeña de ella. – dmckee

+1

Cierto, se necesita mucho más que esto para algo casi orientado a objetos. Sin embargo, es la única parte del diseño orientado a objetos que encuentro que * siempre * me falta cuando escribo en C. Además, si * has * intentado emular la herencia y el polimorfismo en C (más trabajo de lo que vale)), casi seguramente necesitarías comenzar con tipos opacos. –

+4

Recuerde que c y la cultura que engendró datan de una época en la que la orientación a objetos era algo raro y aún bastante experimental. Programadores procesales y funcionales del tiempo concentrado de encapsulación como * el * medio de controlar la interconectividad y la complejidad innecesaria. Hablar de tipos opacos en c como un tipo de objeto lisiado está impulsando un POV extranjero sobre el lenguaje. - dmckee hace 10 minutos – dmckee

8

Un tipo opaco es un tipo que se expone en las API a través de un puntero pero que nunca se define concretamente.

Cuestiones relacionadas