我对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 {...};
答案 0 :(得分:14)
struct alarmparams;
是不完整类型的声明。您可以创建指向此类型对象的指针,但不能声明此类型的对象或在完成之前获取其大小。您必须在main.c
中显示其完整声明,以声明其类型的对象。
如果您同时使用alarm.c
和main.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
的值必须在编译时知道(在这种情况下很可能是这样,但以防万一)。