warning: la déclaration ‘index’ masque une déclaration globale

Mon compilateur (gcc) affiche l’avertissement

warning: la déclaration ‘index’ masque une déclaration globale

S’il vous plaît, aidez-moi à comprendre pourquoi cet avertissement vient.

C’est quand tu fais quelque chose comme:

int index; int main (void) { int index; .... return 0; } 

Ce qui avertit, c’est que l’ index dans main() cache en réalité l’ index global que vous avez déclaré avant main() .

Cela vous avertit que vous ne pouvez pas accéder à la définition globale tant que la définition locale est “active”. Maintenant, ce n’est pas nécessairement un problème (c’est pourquoi il ne s’agit que d’un avertissement), c’est parfaitement valide, mais vous devez être conscient des conséquences possibles.

Par ailleurs, certaines implémentations C (basées sur BSD) définissent une fonction d’ index dans ssortingng.h ce qui peut également poser problème. L’utilisation de cette fonction est obsolète et n’apparaît pas dans le standard C (utilisez plutôt strchr ), mais cela peut être la cause de problèmes si vous utilisez (par exemple) Mac OS ou OpenBSD (ou même Linux sous une combinaison quelconque) des parameters #define , je crois).

Il y a plusieurs façons de contourner ce problème (si vous en avez besoin).

Le premier est probablement le préféré: n’utilisez pas de globaux. Oui, c’est vrai, débarrassez-vous d’eux. Ils sont très rarement nécessaires alors ne me faites pas venir et vous gifler 🙂

Une deuxième façon que j’ai vue est de s’assurer qu’ils sont “emballés”. En supposant que vous ayez réellement besoin de globaux (aucune certitude, reportez-vous au paragraphe précédent), créez une structure qui les conserve, comme suit:

 myglobs.h: struct sMyGlobs { int index; // all other globals. }; extern struct sMyGlobs myGlobs; myglobs.c: #include "myglobs.h" struct sMyGlobs myGlobs; main.c: #include  #include "myglobs.h" int main (void) { myGlobs.index = 42; return 0; } 

Cela présente l’avantage qu’il est évident que vous faites référence à une variable globale et qu’elles ne sont jamais cachées, à moins que vous ne définissiez votre propre variable locale appelée myGlobs .