Я не понимаю, почему компилятор дает мне ошибку с этим кодом

у меня есть следующий код 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 ключевое слово (это не нужно, так как вы уже typedefed 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 и использовать указатель в качестве параметра.

на самом деле это было бы менее чем полезно, Так как тип будет просто виден внутри функции. Это сделало бы практически невозможным пройти в параметр за пределами функции.

Итак, компилятор говорит, что, хотя, возможно, это разрешено языком, это не выглядит хорошей идеей!