advertencia: la statement de ‘índice’ sombrea una statement global

Mi comstackdor (gcc) está mostrando la advertencia

advertencia: la statement de ‘índice’ sombrea una statement global

Por favor, ayúdame a entender por qué viene esta advertencia.

Es cuando haces algo como:

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

Lo que advierte es que el index dentro de main() realidad está ocultando el global que has declarado antes de main() .

Le advierte que no puede obtener la definición global mientras que la local está “activa”. Ahora bien, eso no es necesariamente un problema (de ahí que solo sea una advertencia), es perfectamente válido, pero debe ser consciente de las posibles consecuencias.

Además, algunas implementaciones de C (basadas en BSD) definen una función de index en string.h que también puede causar un problema. El uso de esta función está en desuso y no aparece en el estándar C (use strchr en strchr lugar), pero puede ser la causa de problemas si está ejecutando (por ejemplo) Mac OS o OpenBSD (o incluso Linux bajo alguna combinación) de #define configuraciones, creo).

Hay un par de maneras de evitar esto (si es necesario).

El primero es probablemente el preferido: no uses globals. Sí, es cierto, deshacerse de ellos. Son muy raramente necesarios, así que no me hagas venir y abofetearte 🙂

Una segunda forma que he visto es asegurarse de que estén “empaquetados”. Suponiendo que realmente necesita globales (de ninguna manera es una certeza, consulte el párrafo anterior), cree una estructura que los contenga, como en el siguiente:

 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; } 

Esto tiene la ventaja de que es obvio que te refieres a un global y que nunca se ocultan, a menos que hagas algo como definir tu propia variable local llamada myGlobs .