2012-09-16 31 views
10

utilizo el siguiente código mucho en C:estática en typedef struct

typedef struct 
    { 
    int member; 
    } structname; 

Ahora estoy tratando de mantener esa definición struct local a un archivo fuente en particular, por lo que ningún otro archivo de origen, incluso sabe 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?

+5

No es "lloriquear", amigo. Es un * error de sintaxis *. – paulsm4

Respuesta

21

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 eres ni declarar una variable ni la definición de un nuevo tipo.

+0

Lo siento, no puse todo mi código en la segunda vez. Edité mi publicación para arreglar esto – nuju

+5

Todavía es ilegal mi amigo. static se puede usar solo para declarar una variable o una función, no para definir un nuevo tipo. static y typefef no van juntos. –

4

Una definición de estructura es privada para un archivo de origen 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 directa del formulario struct structname; typedef struct structname structname; en el archivo de cabecera, y use structname * en cualquier otro lugar de 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.

+0

Esto me confunde. ¿Estás diciendo que debe usarse como un puntero incluso si está en el archivo de encabezado? – Aerovistae

+0

@ Aerovistae: si * está * en el archivo de encabezado, entonces no es privado, y puede ser utilizado completamente por cualquier archivo que incluya el archivo de encabezado. – nneonneo

+0

He publicado una pregunta sobre esto para no empantanarse con un largo intercambio de comentarios, si está interesado en responder-- http://stackoverflow.com/questions/27933144/how-do-structs-behave-in -terms-of-visibility-to-other-files – Aerovistae

3

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 quiere restringir el uso de su struct, puede declararlo en el archivo en el que lo usa o crear un encabezado especial que solo incluya su archivo.

1

La respuesta de Hernan Velasquez es la respuesta correcta: hay varios problemas con su 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;