¿Qué es un puntero opaco en C?

¿Puedo saber el uso y la lógica detrás del concepto de puntero opaco en C?

Un puntero opaco es aquel en el que no se revelan detalles de los datos subyacentes (a partir de una definición del diccionario: opaque: adjetivo; no se puede ver a través, no es transparente ).

Por ejemplo, puede declarar en un archivo de encabezado (esto es de parte de mi código actual):

typedef struct pmpi_s *pmpi; 

que declara un tipo pmpi que es un puntero a la estructura opaca struct pmpi_s , por lo tanto, cualquier cosa que pmpi como pmpi será un puntero opaco.

Los usuarios de esa statement pueden escribir libremente código como:

 pmpi xyzzy = NULL; 

sin conocer la “definición” real de la estructura.

Luego, en el código que conoce sobre la definición (es decir, el código que proporciona la funcionalidad para el manejo de pmpi , puede “definir” la estructura:

 struct pmpi_s { uint16_t *data; // a pointer to the actual data array of uint16_t. size_t sz; // the allocated size of data. size_t used; // number of segments of data in use. int sign; // the sign of the number (-1, 0, 1). }; 

y acceder fácilmente a los campos individuales de la misma, algo que los usuarios del archivo de encabezado no pueden hacer.

Más información se puede encontrar en la página de Wikipedia para punteros opacos.

El uso principal de esta es ocultar los detalles de implementación de los usuarios de su biblioteca. La encapsulación (a pesar de lo que el público de C ++ le dirá) ha existido por mucho tiempo 🙂

Desea publicar los detalles suficientes en su biblioteca para que los usuarios puedan usarla de manera efectiva, y nada más. Publicar más proporciona a los usuarios detalles de los que pueden depender (como el hecho de que la variable de tamaño sz encuentre en una ubicación específica de la estructura, lo que puede llevarlos a omitir los controles y manipularlos directamente.

Entonces encontrará a sus clientes quejándose amargamente cuando cambie las partes internas. Sin esa información de estructura, su API está limitada solo a lo que usted proporciona y se mantiene su libertad de acción con respecto a las partes internas.