无效使用未定义的类型和存储大小未知

invalid use of undefined type & storage size unknown

我正在尝试将一些函数移动到 c 项目中的单独文件。

我用

制作了util.h文件
#ifndef _UTIL_H
#define _UTIL_H

#include <signal.h>
#include <termios.h>
#include <time.h>

...

extern struct timeval tv1, tv2, dtv;

void time_start();

long time_stop();

我用

制作了util.c文件
#include "util.h"

...
struct timeval tv1, tv2, dtv;

void time_start() { gettimeofday(&tv1, &timezone); }

long time_stop()
{
    gettimeofday(&tv2, &timezone);
    dtv.tv_sec = tv2.tv_sec - tv1.tv_sec;
...

在cmake中我有

add_executable(mpptd mpptd.c util.c)

我在编译过程中遇到以下错误

[build] ../settings/daemons/util.c: In function ‘time_stop’:
[build] ../settings/daemons/util.c:14:8: error: invalid use of undefined type ‘struct timeval’
[build]      dtv.tv_sec = tv2.tv_sec - tv1.tv_sec;
[build]         ^

[build] ../settings/daemons/util.c: At top level:
[build] ../settings/daemons/util.c:7:16: error: storage size of ‘tv1’ isn’t known
[build]  struct timeval tv1, tv2, dtv;
[build]                 ^~~

这里有什么问题吗?为什么“存储大小”错误比“未定义类型”错误晚?不早点去吗?

struct timeval 在 sys/time.h 中定义。您需要将其包括在内。

#ifndef _UTIL_H
#define _UTIL_H

#include <signal.h>
#include <termios.h>
#include <time.h>
#include <sys/time.h>

...

结构定义(带有 struct { .. } 的部分)必须对使用该结构的代码可见。只需将该部分放入使用该结构的代码可见的 header 中,然后包含该 header.

否则,该结构将作为不完整类型的前向声明结束。不完整的类型没有任何大小,因此会出现神秘的错误。

在这种情况下,您似乎使用了一些 non-standard、non-POSIX(或者可能是过时的 POSIX?)库。严格的编译器(如 -std=c11 -pedantic-errors 模式下的 gcc)不允许在标准 header 中出现 non-standard 废话,因此您必须包含特定的 non-standard header 单独地,该结构将不会在 time.h.

中找到