结构中的“警告:空声明中无用的存储类说明符”

时间:2016-05-14 17:33:18

标签: c struct error-handling compiler-errors linked-list

typedef struct item {
    char *text;
    int count;
    struct item *next;
};

所以我有这个结构,节点定义如上,但我得到下面的错误,我无法弄清楚什么是错的。

  

警告:空声明中无用的存储类说明符    };

4 个答案:

答案 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_tunsigned 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;
}