Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

'struct n_list' declared inside parameter list

2 réponses
Avatar
unbewusst
gcc me dit :
In file included from systemprofile.c:1:
systemprofile.h:20: warning: 'struct n_list' declared inside parameter
list
systemprofile.h:20: warning: its scope is only this definition or
declaration, which is probably not what you want
systemprofile.c:70: warning: 'struct n_list' declared inside parameter
list


struct n_list est d=E9clar=E9 dans "hash_tab.h" :


struct n_list {
struct n_list *next;
char *key;
char *value;
};

dans systemprofile.h il y a la d=E9finition de fonctions utilisant
struct n_list...

je ne vois pas trop le pb, mais bon, c'est juste un "warning"...

2 réponses

Avatar
Antoine Leca
En news:,
unbewusst va escriure:
gcc me dit :
In file included from systemprofile.c:1:
systemprofile.h:20: warning: 'struct n_list' declared inside parameter
list
systemprofile.h:20: warning: its scope is only this definition or
declaration, which is probably not what you want


Traduit en français, cela signifie que la construction

int f ( struct machin {int truc;} );

déclare bien une fonction f retournant un int et prenant un paramètre, mais
le type de ce paramètre est inaccessible.
En effet, la portée de la déclaration de la structure machin s'arrête... au
niveau de la parenthèse fermante du prototype !

Et si par hasard tu écris plus loin

struct machin bidule;

ou

struct machin {int truc;} bidule;

tu vas définir une *nouvelle* structure ; et elle sera incompatible avec
celle de la déclaration de fonction, donc écrire (en mode -ansi)

f(bidule);

va te retourner une erreur de compatibilité de type, incompréhensible pour
ceux qui étaient habitués aux règles moins strictes qui précédaient la norme
de 1990.
GCC, dans sa grande mansuétude, previent les dits contrevenants du problème.
La solution habituelle est de déplacer la définition du type structure avant
le prototype, et faire que celui-ci se réduise à

int f ( struct machin );


Antoine

Avatar
espie
In article <fb3oji$a1e$,
Antoine Leca wrote:
GCC, dans sa grande mansuétude, previent les dits contrevenants du problème.
La solution habituelle est de déplacer la définition du type structure avant
le prototype, et faire que celui-ci se réduise à

int f ( struct machin );


En pratique, ce que tu decris est rare. Il est peu frequent d'avoir en C
des fonctions qui prennent des structures en parametre. Et effectivement,
pour que le compilo ne rale pas, il faut que la definition de la structure
soit visible.

Ce qui est bien plus frequent et utile, c'est d'avoir des fonctions qui
prennent en parametre un pointeur sur une structure. Dans pas mal de cas,
celui-ci peut etre vu comme un type abstrait (opaque) et on n'a aucun
besoin de la definition de la structure.

Par contre, comme tu le signales, les regles de portee du C, interpretees
a la lettre, conduisent a une creation locale de nom de structure lors
d'un
extern void f(struct machin *);

Il suffit alors de *declarer* la structure en question (pas besoin de
definition) sur une portee plus globale (unite de compilation) pour
s'assurer de la coherence avec toute definition ulterieure (y compris dans
d'autres unites de compilation). C'est l'idiome classique:

struct machin;
extern void f(struct machin *);

(similaire au classique des structures de donnees recursives:
struct b {
struct a *f;
...
};

sauf que la, l'absence de declaration preliminaire n'est pas un probleme,
puisque la definition de structure n'introduit pas de portee supplementaire).