web-dev-qa-db-fra.com

"avertissement: spécificateur de classe de stockage inutile dans une déclaration vide" dans la structure

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

J'ai donc cette structure avec des nœuds définis comme ci-dessus, mais je reçois l'erreur ci-dessous et je ne suis pas en mesure de comprendre ce qui ne va pas.

avertissement: spécificateur de classe de stockage inutile dans une déclaration vide};

11
spacing

Je ne suis pas sûr, mais essayez comme ça:

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

Le typedef est inutile car vous ne lui avez pas donné de nom. Vous ne pouvez en aucun cas utiliser le typedef. C'est pourquoi vous obtenez un avertissement, car le typedef est inutile.

5
gnasher729

La structure est en fait toujours utilisable sans avertissement si vous supprimez le mot clé typedef comme ceci:

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

Il vous suffit d'inclure le mot-clé 'struct' dans la déclaration de variable. c'est à dire.

struct item head;

comme d'autres l'ont souligné si vous incluez le nom à la fin de la définition de la structure, vous pouvez l'utiliser comme typedef et vous vous débarrassez de l'avertissement même sans le mot-clé struct mais cela rend la première instance de 'item' superflue, c'est-à-dire.

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

item head;

supprimera également l'avertissement.

2
codeasaurus

typedef est utilisé pour créer une notation abrégée pour un type existant en C. Il est similaire à #define mais contrairement à lui, typedef est interprété par le compilateur et offre des capacités plus avancées que le préprocesseur.

Avec sa forme la plus simple, typedef est donné comme

typedef existing_type new_type;

par exemple,

typedef unsigned long UnsignedLong;

Par exemple, si vous tracez la définition de size_t retour à sa racine, vous verrez que

/* 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;   

puis

/* stddef.h */
typedef __size_t    size_t;

ce qui signifie en fait, size_t est un alias pour unsigned long long, selon le modal 64 bits (LP64, ILP64, LLP64) de vos machines.

Pour votre question, vous essayez de définir un nouveau type mais ne le nommez pas. Ne laissez pas le struct item {..} la définition vous confond, c'est juste un type que vous déclarez. Si vous remplacez l'ensemble struct item {...} avec un type de base, disons avec un int, et réécrivez votre typedef, vous obtiendrez quelque chose comme ça

typedef int; /* new type name is missing */

la forme correcte doit être

typedef struct item {...} Item;

Voir les exemples ci-dessous pour différentes définitions de structure

#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;
}
1
fnisi