advertencia en statement externa

#include #include #define GREY 1 #define BLACK 0 #define WHITE 2 typedef struct node * graph; typedef struct stack * snode; graph cnode(int data); //cnode is to create a node for graph void cgraph(void); struct node { int data, color; struct node *LEFT, *RIGHT, *TOP, *DOWN; };//this structure defines a node of the graph struct stack { struct stack *priv; struct cgraph *graph_node; };// this is to define a structure which should hold node of a structure extern snode sroot; 

Definí un archivo de encabezado (statement.h) como se muestra arriba y a continuación está el progtwig ac (stack.c) Estoy creando lo que se usaría en la biblioteca que estoy desarrollando

 #include void cstack (graph temp); void stackpush(snode stemp); extern int stack_counter = 0; sroot=NULL; void cstack (graph gtemp) //cstack is to create stack { snode spriv,some; if (stack_counter==0) { sroot=stackpush(gtemp); spriv=sroot; stack_counter++; } else{ some=cstacknode(gtemp); some->priv=spriv; spriv=some; } } //struct stack is representing a stack //struct node is representing a node in graph snode cstacknode (graph gtemp) //this function should create a node of the stack which should be storing the graph node as a pointer { snode an; an=(snode)malloc(sizeof(snode)); an->graph_node=gtemp; an->priv=NULL; return an; } void stackpush(snode stemp) { } 

Los dos archivos anteriores están en el mismo directorio. Compilé el archivo anterior stack.c cc -I ./ stack.c I siguiendo advertencias

 stack.c:4: warning: 'stack_counter' initialized and declared 'extern' stack.c:6: warning: data definition has no type or storage class stack.c:6: error: conflicting types for 'sroot' ./declarations.h:21: note: previous declaration of 'sroot' was here stack.c:6: warning: initialization makes integer from pointer without a cast stack.c: In function 'cstack': stack.c:12: warning: passing argument 1 of 'stackpush' from incompatible pointer type stack.c:3: note: expected 'snode' but argument is of type 'graph' stack.c:12: error: void value not ignored as it ought to be stack.c:13: warning: assignment makes pointer from integer without a cast stack.c:17: warning: assignment makes pointer from integer without a cast stack.c: At top level: stack.c:27: error: conflicting types for 'cstacknode' stack.c:17: note: previous implicit declaration of 'cstacknode' was here stack.c: In function 'cstacknode': stack.c:32: warning: assignment from incompatible pointer type 

Quiero saber cuándo declaré una variable como externa, que he marcado en negrita. ¿Por qué aparece eso como una advertencia sobre cualquier idea al respecto y si alguien quiere compartir cualquier otra cosa sobre los errores restantes, entonces hágamelo saber?

Si bien su código contiene una serie de errores bastante serios y obvios (ya cubiertos en otras respuestas), la advertencia que coloca en el título de su pregunta es una advertencia totalmente superflua y sin sentido. El comstackdor GCC es conocido por emitir advertencias inútiles. Muchas de esas advertencias parecen derivarse de la creencia incompetente y sin fundamento de alguien de que hacer algo es algo “incorrecto”, mientras que en realidad no hay nada malo en ello.

En su caso la advertencia es activada por

 extern int stack_counter = 0; 

statement. Aparentemente, el “autor” de la advertencia creía que el especificador extern debería reservarse para declaraciones no definitorias. En este caso, la presencia de initializer = 0 convierte la statement en una definición (y, por lo tanto, hace que extern opcional). Sin embargo, no hay error en ello y, de hecho, extern podría ser bastante bienvenido aquí para enfatizar el hecho de que stack_counter pretende ser una variable global.

Nuevamente, si necesita una variable global aquí o no, es una pregunta diferente y, nuevamente, su código contiene una gran cantidad de otros errores. Pero la advertencia en la que parece centrar su atención no merece la pena. Simplemente deshabilite esta advertencia en la configuración del comstackdor (y, por favor, escriba una carta grosera al equipo de GCC).

La statement externa en su archivo de encabezado permite que los módulos distintos de aquel en el que se define la variable lo utilicen. Si se supone que debe definirse como int stack_counter = 0 y vivir en stack.c, defínalo de esta manera y coloca un extern stack_counter en el encabezado.

En la línea 6 de stack.c, no definió una clase de almacenamiento para sroot. Ya que se encuentra en el encabezado, asumo que snode sroot=NULL escribir snode sroot=NULL .

Arregle esos, luego aplique stackpush (asegúrese de que no vuelva vacío) y maneje el rest de sus advertencias en orden. Tenga en cuenta que en C, debe usar declaraciones de funciones hacia adelante (con prototipos) o definir sus funciones antes de que se usen. La función cstack probablemente debería ser la última función en el archivo.