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?
Respuesta
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.
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
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
siegeX: Cambié la publicación para evitar la confusión sobre la implementación – Phong
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.
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
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. –
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
Un tipo opaco es un tipo que se expone en las API a través de un puntero pero que nunca se define concretamente.
- 1. ¿Son realmente necesarios "#define new DEBUG_NEW" y "#undef THIS_FILE" etc.?
- 2. ¿Cuándo son útiles las transformaciones de Schwartz?
- 3. ¿Cuándo son útiles los hilos daemon?
- 4. ¿Qué son las cookies firmadas y por qué son útiles?
- 5. ¿Qué significa el término "tipo opaco" en el contexto de "tipo opaco CFBundleRef"?
- 6. ¿Cuándo son útiles los bucles infinitos en PHP?
- 7. ¿Qué es un valor opaco?
- 8. ¿Cuándo son más útiles los constructores de expresiones ASP.NET?
- 9. Cuándo utilizar 'yo' en Ruby
- 10. ¿Son necesarios FileChannel.force y FileDescriptor.sync?
- 11. SQL, OID de Postgres, ¿qué son y por qué son útiles?
- 12. ¿Qué conjuntos son necesarios para MVC4?
- 13. ¿Qué permisos son necesarios para ejecutar Magento?
- 14. Cierres: ¿por qué son tan útiles?
- 15. readelf vs. objdump: por qué ambos son necesarios
- 16. ¿Qué son vistas para colecciones y cuándo las quieres usar?
- 17. error Scala: encontrado y son necesarios misma
- 18. ¿Son útiles los patrones de diseño en JavaScript? ¿Y qué son exactamente?
- 19. ¿Qué es un octeto JSON y por qué son necesarios dos?
- 20. ¿Cuándo debería usar require() y cuándo usar define()?
- 21. Cortos y útiles fragmentos de Objective-C?
- 22. C: ¿Son globales las directivas #define?
- 23. ¿Bajo qué circunstancias son útiles las propiedades atómicas?
- 24. ¿Cuándo define GCC NDEBUG?
- 25. C#: ¿En qué ensamblado se define SHDocVw.WebBrowser_V1?
- 26. c typedef (ed) puntero opaco
- 27. ¿Cuándo son los comentarios "demasiado" y cuándo no son suficientes?
- 28. ¿Qué es el "yo" en Akka?
- 29. ¿Qué permisos son necesarios para leer Active Directory como LDAP?
- 30. ¿Qué jarrones son exactamente necesarios para incrustar Neo4j?
'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'. –