new - Usar static en typedef struct
new features c# (4)
Utilizo mucho el siguiente código en C:
typedef struct
{
int member;
} structname;
Ahora trato de mantener esa definición de estructura local en un archivo fuente particular, de modo que ningún otro archivo fuente sepa siquiera que la estructura existe. Intenté lo siguiente:
static typedef struct
{
int member;
} structname;
pero GCC se queja debido a un especificador de acceso ilegal. ¿Es posible mantener la declaración de una estructura privada en un archivo fuente?
La respuesta correcta de Hernán Velasquez es que hay varios problemas con el fragmento de código. Aquí hay un contraejemplo:
/* This should go in a .h if you will use this typedef in multiple .c files */
typedef struct {
int a;
char b[8];
} mystructdef;
int
main (int argc, char *argv[])
{
/* "static" is legal when you define the variable ...
... but *not* when you declare the typedef */
static mystructdef ms;
Si declara la estructura typedef dentro de un archivo .c, será privada para ese archivo fuente.
Si declara este typedef en un archivo .h, será accesible para todos los archivos .c que incluyan este archivo de encabezado.
Su declaración:
static typedef struct
Es claramente ilegal ya que no declaras una variable ni defines un nuevo tipo.
Todas las declaraciones son siempre locales para una unidad de traducción particular en C. Es por eso que debe incluir encabezados en todos los archivos fuente que pretendan usar una declaración determinada.
Si desea restringir el uso de su struct
, puede declararla en el archivo en el que la usa o crear un encabezado especial que solo incluya su archivo.
Una definición de estructura es privada para un archivo fuente a menos que se coloque en un archivo de encabezado compartido. Ningún otro archivo fuente puede acceder a los miembros de la estructura, incluso si se le da un puntero a la estructura (ya que el diseño no se conoce en la otra unidad de compilación).
Si la estructura necesita ser utilizada en otro lugar, debe usarse solo como un puntero. Coloque una declaración de avance de la forma struct structname; typedef struct structname structname;
struct structname; typedef struct structname structname;
en el archivo de cabecera, y use structname *
cualquier otro lugar en su código base. Luego, dado que los miembros de la estructura aparecen solo en un archivo fuente, los contenidos de la estructura son efectivamente ''privados'' para ese archivo.