2010-07-12 22 views
6

Tengo dos archivos c, foo.c con la funcionalidad y test_foo.c que prueban las funciones de foo.c.Cómo declarar extern typedef struct?

¿Hay alguna manera de acceder a struct typedef BAR que definí en foo.c en test_foo.c sin usar un archivo de cabecera? Hasta ahora, pude evitar un archivo h para que todo el programa consistiera en foo.c. Gracias.

foo.c 
typedef struct BAR_{...} bar; 
BAR *bar_new(...) {..} 

test_foo.c 
extern BAR *bar_new(...) 

error: expected declaration specifiers or ‘...’ before ‘BAR’

Respuesta

6

La respuesta es que hay una y, en su lugar, debe usar un archivo de encabezado. Puede copiar la definición de la estructura typedef struct BAR_{...} bar; en test_foo.c y funcionará. Pero esto causa la duplicación. Cada solución que funciona debe hacer que la implementación de struct esté disponible para el compilador en test_foo.c. También puede usar un ADT si esto le conviene en este caso.

+1

Mover la definición al archivo de encabezado es la solución correcta solo si test_foo.c (o cualquier otro módulo fuera de foo.c) necesita acceder a la estructura de contenido en sí. Si es un ADT o por algún otro motivo test_foo.c no necesita las partes internas del tipo, creo que una declaración directa es una mejor solución. – harald

+1

Por ahora, acabo de copiar la definición en el otro archivo c. – Framester

+0

Estoy haciendo lo mismo: estoy desarrollando un arnés de prueba que se supone que se ajusta al código de producción. En el código de producción, la definición de estructura no tiene ningún negocio que sea pública y debe ser enterrada. Por lo tanto, tuve que copiar la definición en mi arnés de prueba. Esto es una duplicación, pero mi enlazador es lo suficientemente inteligente como para darme advertencias si uno cambia pero no el otro. – Nick

1

Usted tendría que suministrar la definición de BAR en test_foo.c. Si depende de ti la duplicación de tener un encabezado depende de ti.

4

Suelta el typedef.

En foo.c:

struct bar 
{ 
    ... 
}; 

struct bar *bar_new(....) 
{ 
    return malloc(sizeof(struct bar)); 
} 

En test_foo.c:

struct bar; 

struct bar *mybar = bar_new(...); 

Tenga en cuenta que usted consigue solamente la existencia de un objeto barra de estructura de esta forma, el usuario en test_foo.c no sabe nada sobre el contenido del objeto.

+0

Es mejor que guardes el typedef y simplemente lo arrojes al vacío en foo.c luego. – Nick