2016-04-14 7 views
0

Ich schreibe ein C-Programm, und ich konnte kein entsprechendes Beispiel in Stack Overflow finden. Ich habe 2 Dateien, level.h, lib.h, die von dem Typ abhängen, der in der Datei des anderen definiert ist. Dies erzeugt einen Fehler, redefinition of typedef 'metalevel_t'/'entry_t' is a C11 feature.Wie wird die Forward-Deklaration in C verwendet?

level.h:

#ifndef level_H 
#define level_H 
#include "lib.h" 

// level.h 
typedef struct metalevel metalevel_t; 


// key value pairs, value are integers 
typedef struct entry { 
    ... 
} entry_t; 

lib.h:

typedef struct entry entry_t; 
typedef struct metalevel{ 
    entry_t* ...; 
} metalevel_t; 

metalevel_t Info[...]; 

Wenn ich jedoch entry_t (und metalevel_t) ersetzen unten, ich typedef requires a name Fehler.

struct entry { 
    ... 
}; 

Mein Makefile sieht wie folgt aus:

CC=gcc 
CFLAGS=-I. 
CFLAGS=-std=c99 
LDFLAGS = -lm 

macro_main: macro_main.o lsm.o lib.o level.o 
    $(CC) -o macro_main macro_main.o lsm.o lib.o level.o $(CFLAGS) 

macro_main.o: 

clean: 
     $(RM) macro_main 

Wie kann ich nach vorne Erklärung in diesem Fall benutzen?

+0

Entfernen Sie 'typedef struct metalevel metalevel_t;' aus 'level.h'. Diese Datei enthält sowieso 'lib.h', so dass sie das existierende Typedef sehen kann. –

Antwort

4

level.h:

#include "lib.h" 

struct entry { 
    // ... 
}; 

lib.h:

typedef struct entry entry_t; 
typedef struct metalevel{ 
    entry_t* p; 
} metalevel_t; 

nicht sicher, was Sie von metalevel_t Info[...]; gemeint, das ist wahrscheinlich zu einem Fehler für alle möglichen Inhalte der ... führen.

+0

Entschuldigung, wenn das irreführend ist. "..." in metalevel_t Info [...] ist eine vordefinierte Größe. – Pippi

+0

@Pippi: Deklarieren Sie dieses Array in der Kopfzeile? Wenn dies der Fall ist, wird jede Quelldatei, die diesen Header enthält, am Ende neu deklariert (was schlecht ist). – dreamlax

+1

@Pippi Es sollte 'extern metalevel_t Info [5];' in diesem Fall sein –

Verwandte Themen