Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我不知道';我不明白为什么编译器给我这个代码的错误_C_Linux_Gcc_Clang_X86 64 - Fatal编程技术网

C 我不知道';我不明白为什么编译器给我这个代码的错误

C 我不知道';我不明白为什么编译器给我这个代码的错误,c,linux,gcc,clang,x86-64,C,Linux,Gcc,Clang,X86 64,我有下面的C代码,在我看来非常正确。然而,clang编译器(实际上是gcc或任何其他C编译器)却不这么认为 typedef struct { struct timeval td_start; struct timeval td_end; } Timer; void startTimer( struct Timer* ptimer ) { gettimeofday( &(ptimer->td_start), NULL ); } void stopTime

我有下面的C代码,在我看来非常正确。然而,clang编译器(实际上是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 );
}
编译器给出以下警告和错误消息。你知道这里怎么了吗

./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 )

删除
struct
关键字(不需要它,因为您已经
typedef
ed了该结构):

或者,删除
typedef

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

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

void stopTimer( struct Timer* ptimer ) 
{
  ...
有关更多信息,请参见

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
,并使用指向该类型的指针作为参数

实际上这样做并没有多大用处,因为类型只在函数内部可见。这实际上不可能从函数外部传入参数


所以编译器说,虽然语言可能允许,但这看起来不是一个好主意

更好的解决方案:不要使用typedef!威廉:但是在ANSI C中,你必须在struct前面加上一个结构变量,对吗!在C++中,我不需要结构。但不确定C99。
void startTimer( struct Timer* ptimer )