2010-07-12 25 views
6

Ho due file c, foo.c con la funzionalità e test_foo.c che testano le funzioni di foo.c.Come dichiarare extern typedef struct?

C'è un modo per accedere alla struct typedef BAR definito in foo.c in test_foo.c senza utilizzare un file di intestazione? Finora, sono stato in grado di evitare un file h in modo che l'intero programma fosse costituito da foo.c. Grazie.

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

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

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

risposta

6

La risposta è che ce n'è uno, e invece dovresti usare un file di intestazione. È possibile copiare la definizione della struttura typedef struct BAR_{...} bar; in test_foo.c e funzionerà. Ma questo causa la duplicazione. Ogni soluzione che funziona deve rendere l'implementazione di struct disponibile per il compilatore in test_foo.c. Puoi anche usare un ADT se ti va bene in questo caso.

+1

Spostare la definizione nel file di intestazione è la soluzione giusta solo se test_foo.c (o qualsiasi altro modulo esterno a foo.c) deve accedere alla struttura del contenuto stesso. Se si tratta di un ADT o per qualche altra ragione, test_foo.c non ha bisogno dei componenti interni del tipo, penso che una dichiarazione forward sia una soluzione migliore. – harald

+1

Per ora, ho appena copiato la definizione nell'altro file c. – Framester

+0

Sto facendo lo stesso - Sto sviluppando un cablaggio di test che dovrebbe avvolgere il codice di produzione. Nel codice di produzione la definizione della struttura non ha carattere pubblico e dovrebbe essere seppellita. Pertanto ho dovuto copiare la definizione nella mia bardatura di prova. Questa è una duplicazione ma il mio linker è abbastanza intelligente da darmi degli avvisi se uno cambia ma non l'altro. – Nick

1

Si avrebbe bisogno di fornire la definizione di Bar in test_foo.c. Spetta a te decidere se la duplicazione è preferibile avere un header.

4

Eliminare il typedef.

In foo.c:

struct bar 
{ 
    ... 
}; 

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

In test_foo.c:

struct bar; 

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

Nota che si ottiene solo l'esistenza di un oggetto struct bar in questo modo, l'utente in test_foo.c non sa nulla del contenuto dell'oggetto.

+0

Si potrebbe anche mantenere il typedef e basta lanciarlo per annullare in foo.c quindi. – Nick