Je ne comprends pas pourquoi le compilateur me donne un erreur avec ce code
J'ai le texte suivant du code C, ce qui est très correct pour moi. Cependant, le compilateur clang (enfait gcc ou de tout autre compilateur C trop) pense le contraire.
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 );
}
Le compilateur donne le waring & messages d'erreur. Aucune idée de ce qu'est le problème ici?
./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 )
OriginalL'auteur pythonic | 2012-05-15
Vous devez vous connecter pour publier un commentaire.
Supprimer la
struct
mot-clé (il n'est pas nécessaire, puisque vous avez déjàtypedef
ed la struct):Vous pouvez également supprimer le
typedef
:Pour plus d'informations, voir Pourquoi devrions-nous un typedef struct si souvent en C?
William: Mais vous avez le préfixe struct avec une variable de structure en C ANSI droit! En C++, je suis d'accord struct n'est pas nécessaire. Pas sûr au sujet de C99.
OriginalL'auteur
Soit vous
Ou vous
Mais ne pas mixup.
OriginalL'auteur
Vous avez créé un nouveau type de Timer, il suffit de supprimer le mot struct avant des paramètres de la fonction, comme ceci, par exemple:
OriginalL'auteur
La raison pour l'erreur, c'est que, lorsque vous arrivez ici
il n'y a pas de
struct Timer
portée (juste un typedef pour un anonyme struct). Ainsi, le compilateur croit que vous souhaitez déclarer un nouveau typestruct Timer
et utiliser un pointeur pour qu'en tant que paramètre.Effectivement cela serait moins utile, comme le type devrait être visible à l' à l'intérieur de la fonction. Qui rendrait pratiquement impossible de passer un paramètre à partir de à l'extérieur la fonction.
De sorte que le compilateur dit que, éventuellement, autorisé par la langue, ça ne ressemble pas à une bonne idée!
OriginalL'auteur