2012-05-15 10 views
8

Ich habe den folgenden C-Code, der sehr korrekt zu mir aussieht. Der "clam" -Compiler (eigentlich gcc oder irgendein anderer C-Compiler) denkt jedoch anders.Ich verstehe nicht, warum Compiler gibt mir Fehler mit diesem Code

typedef struct 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
} Timer; 

void startTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

void stopTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_end), NULL); 
} 

Der Compiler gibt folgende Waring & Fehlermeldungen. Irgendeine Idee, was hier falsch ist?

./timing.h:14:25: warning: declaration of 'struct Timer' will not be visible 
     outside of this function [-Wvisibility] 
void startTimer(struct Timer* ptimer) 
         ^
./timing.h:16:27: error: incomplete definition of type 'struct Timer' 
    gettimeofday(&(ptimer->td_start), NULL); 
        ~~~~~~^ 
./timing.h:14:25: note: forward declaration of 'struct Timer' 
void startTimer(struct Timer* ptimer) 
         ^
./timing.h:19:24: warning: declaration of 'struct Timer' will not be visible 
     outside of this function [-Wvisibility] 
void stopTimer(struct Timer* ptimer) 
        ^
./timing.h:21:27: error: incomplete definition of type 'struct Timer' 
    gettimeofday(&(ptimer->td_end), NULL); 
        ~~~~~~^ 
./timing.h:19:24: note: forward declaration of 'struct Timer' 
void stopTimer(struct Timer* ptimer) 

Antwort

15

Entfernen Sie die struct Schlüsselwort (es da nicht gebraucht haben Sie bereits typedef ed die struct):

void startTimer(Timer* ptimer) 
{ 
    ... 

void stopTimer(Timer* ptimer) 
{ 
    ... 

Alternativ entfernen Sie die typedef:

struct Timer 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
}; 

void startTimer(struct Timer* ptimer) 
{ 
    ... 

void stopTimer(struct Timer* ptimer) 
{ 
    ... 

Für weitere Informationen, siehe Why should we typedef a struct so often in C?

+2

Eine bessere Lösung: Verwenden Sie nicht den Typedef! –

+0

William: Aber Sie müssen struct mit einer Strukturvariablen in ANSI C rechts vorstellen! In C++ stimme ich struct ist nicht erforderlich. Nicht sicher über C99 obwohl. – pythonic

4

Entweder Sie

struct Timer 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
}; 

void startTimer(struct Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

Oder Sie

typedef struct 
{ 
    struct timeval td_start; 
    struct timeval td_end; 
} Timer; 

void startTimer(Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 

Aber nicht mixup.

3

Sie haben eine Art Timer aufgerufen, löschen Sie einfach das Wort Struktur, bevor die Funktionsparameter, wie dies zum Beispiel:

void startTimer(Timer* ptimer) 
{ 
    gettimeofday(&(ptimer->td_start), NULL); 
} 
2

Der Grund für den Fehler ist, dass, wenn Sie hier

Es gibt keine struct Timer in Geltungsbereich (nur ein Typedef für eine anonyme Struktur). Der Compiler glaubt also, dass Sie einen neuen Typ struct Timer deklarieren und einen Zeiger als Parameter verwenden möchten.

Eigentlich wäre das weniger als nützlich, da der Typ nur innerhalb der Funktion sichtbar wäre. Das würde es praktisch unmöglich machen, einen Parameter von außerhalb der Funktion zu übergeben.

Also der Compiler sagt, dass, obwohl möglicherweise von der Sprache erlaubt, dies nicht wie eine gute Idee aussieht!