He visto un poco el concepto de ‘tipos opacos’, pero realmente no he encontrado una respuesta sucinta 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?
asedioX
Phong
Es el más utilizado para fines de biblioteca. El principio principal detrás del tipo opaco en c es usar datos a través de su puntero para ocultar la implementación del manejo de datos. Dado que la implementación está oculta, puede modificar la biblioteca sin volver a compilar ningún programa que dependa de ella (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 el lado de su programa, ¡nada cambió! y como se dijo anteriormente, no es necesario volver a compilar todos los programas que dependen de él.
-
Supongo que las porciones de ‘//implementación’ no son parte del mismo ‘//archivo de encabezado’ y ¿qué van en las bibliotecas? Además, parece que declaraste
struct s
en el encabezado pero nunca lo definió hasta la implementación. Recientemente leí una gran publicación sobreextern
variables en C stackoverflow.com/questions/1433204/… Los conceptos parecen sorprendentemente similares, no deberíanstruct s
ser declarado comoextern struct s
en su código de muestra?– SiegeX
21 de febrero de 2010 a las 0:14
-
usar extern para variable generalmente se usa para declarar una 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 SOLO usan un puntero a esta estructura. No necesita saber el tamaño de la estructura sino el tamaño del puntero de la estructura (que es definido por el compilador). Para simplificar, permite que el programa use un objeto usando su dirección (el puntero a la estructura)
– Phong
21 de febrero de 2010 a las 5:12
-
siegeX: cambié la publicación para evitar la confusión sobre la implementación
– Phong
23 de octubre de 2013 a las 6:23
-
@SiegeX No existe ningún caso en C en el que necesite declarar una variable no constante como
extern
. Aparte del caso en el que tiene constantes globales, la palabra clave extern solo es buena para la programación espagueti. Si alguna vez se encuentra declarando variables como externas/globales, es una señal segura de que el diseño de su programa es muy malo.– Lundin
7 mayo 2015 a las 11:48
Según tengo entendido, los tipos opacos son aquellos que le permiten mantener un controlador (es decir, un puntero) en una estructura, pero no modificar ni ver su contenido directamente (si tiene permiso, 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 el código que lo usa tenga que cambiar.
-
Quibble: este modismo es solamente sobre encapsulación. La encapsulación es necesaria para la orientación a objetos, pero es la parte más pequeña de ella.
– dmckee — gatito ex-moderador
20 de febrero de 2010 a las 18:08
-
Es cierto que se necesita mucho más que esto para cualquier cosa casi orientada a objetos. Aún así, es la única parte del diseño orientado a objetos que encuentro que soy siempre falta cuando escribo en C. Además, si fueron para tratar de emular la herencia y el polimorfismo en C (más trabajo de lo que vale), es casi seguro que necesitará comenzar con tipos opacos.
– Tim Yates
20 de febrero de 2010 a las 18:16
-
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. Los programadores procedimentales y funcionales de la época se concentraron en encapsular como los medio de controlar la interconectividad y la complejidad innecesaria. Hablar de tipos opacos en c como una especie de objeto lisiado es introducir un punto de vista extraño en el lenguaje. – dmckee hace 10 minutos
– dmckee — gatito ex-moderador
20 de febrero de 2010 a las 18:50
-
@dmckee No es solo para encapsular. También puede usar el tipo opaco para implementar herencia/polimorfismo, incluso si esa no era la intención original del tipo incompleto. De todos modos, lo más importante es que la orientación a objetos es un programa. método de diseñoestá no una característica del lenguaje. ¡No importa el idioma, siempre debe usar un diseño de programa orientado a objetos! Y una vez que el diseño esté listo, puede ver qué características de idioma están disponibles y verificar cómo implementa mejor su diseño en el idioma específico.
– Lundin
7 mayo 2015 a las 11:44
Un tipo opaco es un tipo que se expone en las API a través de un puntero pero que nunca se define de forma concreta.
FILE
es un buen ejemplo de un tipo opaco en el estándar C. Todo lo que necesitas es unFILE *
objeto y utilizar funciones estándar de C que operan sobre él. A usted, como programador, no le importa lo queFILE
tipo consta de.– Alok Singhal
20 de febrero de 2010 a las 7:36
pthread_t
es un tipo opaco-Krishna Kanth Yenumula
23 de mayo de 2020 a las 0:48