¿Qué define un tipo opaco en C y cuándo son necesarios y/o útiles?

5 minutos de lectura

avatar de usuario
asedioX

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

  • FILE es un buen ejemplo de un tipo opaco en el estándar C. Todo lo que necesitas es un FILE * objeto y utilizar funciones estándar de C que operan sobre él. A usted, como programador, no le importa lo que FILE 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

avatar de usuario
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 sobre extern variables en C stackoverflow.com/questions/1433204/… Los conceptos parecen sorprendentemente similares, no deberían struct s ser declarado como extern 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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad