C中的struct:'params'的错误存储大小未知

mys*_*ste 6 c struct

我对C有点新意,我正在处理一个我正在研究的项目有点麻烦.基本上我有以下文件:main.c,alarm.c,alarm.h

我在alarm.c中有一个结构声明,如下所示:

#define STRLEN 150;

struct alarmparams
{
    char time[STRLEN];
    char duration[STRLEN];
    char snooze[STRLEN];
    char port[STRLEN];
};
Run Code Online (Sandbox Code Playgroud)

在main.c我有:

#include <stdio.h>
#include <string.h>
#include "alarm.h"

int main(int argc, char *argv[])
{   
    struct alarmparams params;

    printf("%s, %s\n", params.time, params.duration);
}
Run Code Online (Sandbox Code Playgroud)

在alarm.h我有:

struct alarmparams;
Run Code Online (Sandbox Code Playgroud)

现在,当我去编译时,我收到以下错误:

error: storage size of ‘params’ isn’t known
Run Code Online (Sandbox Code Playgroud)

我已经查看了有关此错误的其他帖子,所以我已经对此进行了一些研究.我也尝试了一些建议的解决方案,它要么我得到完全相同的错误,要么我得到了更多的解决方案.我对如何解决这个问题感到很失望.

有什么我想念的吗?我是否错误地宣布了什么?

通常应该在头文件或c文件中声明结构?或者甚至重要吗?有什么不同:

struct foo {...};
Run Code Online (Sandbox Code Playgroud)

typedef struct foo {...};
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 14

struct alarmparams;
Run Code Online (Sandbox Code Playgroud)

是不完整类型的声明.您可以创建指向此类型对象的指针,但不能声明此类型的对象或在完成之前获取其大小.您必须使其完整声明可见,main.c以声明其类型的对象.

如果您在使用这两种类型alarm.cmain.c,只是宣布它alarm.h和包括alarm.hmain.c.

对于你的第二个问题,区别:

struct foo {...};
Run Code Online (Sandbox Code Playgroud)

typedef struct foo {...} foo_;
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,您还声明foo_了类型名称的别名struct foo.


Fil*_*ves 7

您必须在头文件中声明结构alarm.h.

目前,当你包含时alarm.h,main中的代码看不到结构组成,它看到的只是struct alarmparams;,所以它不知道它有多长.如何为不知道需要多少空间的东西分配空间?

typedef struct foo { ... };无效:typedef希望您为类型提供别名.typedef struct foo { ... } foo_t;会是对的.

typedef是一个存储类说明符,因此,您可以将其视为任何其他常规声明.想象一下,你想要一个foo类型的别名bar:只需声明一个类型的变量bar并调用它foo.现在,在前面添加一个typedef关键字,你就完成了.typedef通过这种简单的方法可以很容易地理解复杂的问题.因为struct foo { ... };将是变量的无效声明(没有提供名称),所以也是如此typedef struct foo { ... };.

通常,当您在其他源文件中重用它们时,在头文件中声明结构.如果你不打算这样做,在.c文件中声明它们应该没问题.