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

时间:2013-11-18 20:11:05

标签: 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];
};

在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);
}

在alarm.h中,我有:

struct alarmparams;

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

error: storage size of ‘params’ isn’t known

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

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

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

struct foo {...};

typedef struct foo {...};

3 个答案:

答案 0 :(得分:14)

struct alarmparams;

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

如果您同时使用alarm.cmain.c中的类型,只需在alarm.h中声明并在alarm.h中加入main.c

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

struct foo {...};

typedef struct foo {...} foo_;

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

答案 1 :(得分: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文件中声明它们应该没问题。

答案 2 :(得分:0)

除了其他答案之外,STRLEN的值必须在编译时知道(在这种情况下很可能是这样,但以防万一)。