无效使用未定义的类型和存储大小未知
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
.
中找到
我正在尝试将一些函数移动到 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
.