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};
Je ne suis pas sûr, mais essayez comme ça:
typedef struct item {
char *text;
int count;
struct item *next;
}item;
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.
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.
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;
}