typedef struct item {
char *text;
int count;
struct item *next;
};
所以我有这个结构,节点定义如上,但我得到下面的错误,我无法弄清楚什么是错的。
警告:空声明中无用的存储类说明符 };
答案 0 :(得分:12)
我不确定,但请尝试:
typedef struct item {
char *text;
int count;
struct item *next;
}item;
答案 1 :(得分:5)
typedef没用,因为你没有给它起一个名字。您不能以任何方式使用typedef。这就是你收到警告的原因,因为typedef没用。
答案 2 :(得分:1)
如果删除typedef关键字,结构实际上仍然可以在没有警告的情况下使用:
struct item {
char *text;
int count;
struct item *next;
};
您只需要在变量声明中包含'struct'关键字。即。
struct item head;
正如其他人已经指出的那样,如果在结构定义的末尾包含名称,那么你可以将它用作typedef,即使没有struct关键字你也可以删除警告,但是这会产生'item'的第一个实例多余的,即
typedef struct {
char *text;
int count;
struct item *next;
} item;
item head;
也将摆脱警告。
答案 3 :(得分:1)
typedef
用于为C中的现有类型创建简写符号。它与#define
类似,但与它不同,typedef
由编译器解释并提供更高级的功能而不是预处理器。
凭借其最简单的形式,typedef
被赋予
typedef existing_type new_type;
例如,
typedef unsigned long UnsignedLong;
例如,如果您将size_t
的定义追溯到其根目录,您将看到
/* sys/x86/include/_types.h in FreeBSD */
/* this is machine dependent */
#ifdef __LP64__
typedef unsigned long __uint64_t;
#else
__extension__
typedef unsigned long long __uint64_t;
#endif
...
...
typedef __uint64_t __size_t;
然后
/* stddef.h */
typedef __size_t size_t;
实际上意味着,size_t
是unsigned long long
的别名,具体取决于您的计算机所具有的64位模式(LP64,ILP64,LLP64)。
对于您的问题,您尝试定义新类型但不命名。不要让struct item {..}
定义让您感到困惑,这只是您宣布的类型。如果您将整个struct item {...}
替换为基本类型,例如使用int
,并重写typedef
,则最终会出现类似
typedef int; /* new type name is missing */
正确的表格应该是
typedef struct item {...} Item;
请参阅以下示例了解不同的结构定义
#include <stdio.h>
/* a new type, namely Item, is defined here */
typedef struct item_t {
char *text;
int count;
struct item_t *next; /* you canot use Item here! */
} Item;
/* a structure definition below */
struct item {
char *text;
int count;
struct item *next;
};
/* an anonymous struct
* However, you cannot self-refence here
*/
struct {
int i;
char c;
} anon;
int main(void) {
/* a pointer to an instance of struct item */
struct item *pi;
/* Shorthand for struct item_t *iI */
Item *iI;
/* anonymoous structure */
anon.i = 9;
anon.c = 'x';
return 0;
}