Я не понимаю, почему компилятор дает мне ошибку с этим кодом
у меня есть следующий код C, который выглядит очень правильным для меня. Однако компилятор clang (infact gcc или любой другой компилятор C) думает иначе.
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 );
}
компилятор выдает следующие сообщения waring & error. Есть идеи, что здесь не так?
./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 )
4 ответов
удалить struct
ключевое слово (это не нужно, так как вы уже typedef
ed The struct):
void startTimer( Timer* ptimer )
{
...
void stopTimer( Timer* ptimer )
{
...
в качестве альтернативы удалите typedef
:
struct Timer
{
struct timeval td_start;
struct timeval td_end;
};
void startTimer( struct Timer* ptimer )
{
...
void stopTimer( struct Timer* ptimer )
{
...
дополнительные сведения см. В разделе почему мы должны typedef структуры так часто в C?
либо
struct Timer
{
struct timeval td_start;
struct timeval td_end;
};
void startTimer( struct Timer* ptimer )
{
gettimeofday( &(ptimer->td_start), NULL );
}
или
typedef struct
{
struct timeval td_start;
struct timeval td_end;
} Timer;
void startTimer( Timer* ptimer )
{
gettimeofday( &(ptimer->td_start), NULL );
}
но не смешение.
вы создали тип Timer, просто удалите слово struct перед параметрами функции, например:
void startTimer( Timer* ptimer )
{
gettimeofday( &(ptimer->td_start), NULL );
}
на причина ибо ошибка в том, что, когда вы доберетесь сюда
void startTimer( struct Timer* ptimer )
нет struct Timer
в области (просто typedef для анонимной структуры). Таким образом, компилятор считает, что вы хотите объявить новая тип struct Timer
и использовать указатель в качестве параметра.
на самом деле это было бы менее чем полезно, Так как тип будет просто виден внутри функции. Это сделало бы практически невозможным пройти в параметр за пределами функции.
Итак, компилятор говорит, что, хотя, возможно, это разрешено языком, это не выглядит хорошей идеей!