我对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.c和main.c,只是宣布它alarm.h和包括alarm.h中main.c.
对于你的第二个问题,区别:
struct foo {...};
Run Code Online (Sandbox Code Playgroud)
和
typedef struct foo {...} foo_;
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,您还声明foo_了类型名称的别名struct foo.
您必须在头文件中声明结构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文件中声明它们应该没问题.
| 归档时间: |
|
| 查看次数: |
24764 次 |
| 最近记录: |