2010-11-24 15 views
8
#include<stdio.h> 
#include<stdlib.h> 
#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; 

he definido un archivo de cabecera (declaration.h) como antes y después del programa es de corriente alterna (stack.c) estoy haciendo que se utilizaría en la biblioteca que estoy desarrollandoadvertencia en la declaración extern

#include<declarations.h> 
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) 
{ 

} 

ambos archivos están en el mismo directorio. He compilado el archivo anterior stack.c cc -I ./ stack.c I siguientes 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 cuando he declarado una variable como extern que he marcado en negrita ¿por qué recibo como una advertencia alguna idea sobre eso y si alguien quiere compartir cualquier otra cosa sobre los errores restantes, házmelo saber.

+0

Vea también la pregunta mucho más reciente [Cómo definir la variable 'extern' junto con la declaración?] (Http://stackoverflow.com/questions/24436770/how-to-define-extern-variable-along-with- declaración) –

Respuesta

29

Si bien su código contiene una serie de errores bastante serios y obvios (ya se cubrieron en otras respuestas), la advertencia que coloca en el título de su pregunta es una advertencia totalmente innecesaria y sin sentido. El compilador de GCC es notorio por emitir advertencias inútiles. Muchas de esas advertencias parecen derivarse de la creencia incompetente y completamente infundada de alguien de que hacer algo es de alguna manera "incorrecto", mientras que en realidad no hay nada de malo en ello.

En el caso de que el aviso se activa por

extern int stack_counter = 0; 

declaración. Aparentemente, el "autor" de la advertencia creía que el especificador extern debería reservarse para declaraciones no definitorias. En este caso, la presencia del inicializador = 0 convierte la declaración en una definición (y así formalmente hace que extern sea opcional). Sin embargo, no hay ningún error en ello y, de hecho, extern podría ser muy bienvenido aquí para enfatizar el hecho de que stack_counter está destinado a ser una variable global.

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

+5

Para ser justos, esta es una advertencia que puede presagiar (y ayudar a resolver) un error del enlazador (definición múltiple). Por ejemplo ... en TU 1 uno crea un global y lo asigna, luego en TU 2 copiamos la declaración y luego anteponemos 'extern' a esa declaración. La inicialización que está presente con extern hace que el extern signifique algo diferente y por lo tanto causa que se creen dos instancias de esta variable y el enlazador barfs ... Esto no quiere decir que su punto sea menos válido, pero esta es probablemente la razón para la advertencia de que existe ... –

+2

@StevenLu: Entonces, GCC advierte antes de que ocurra el error, y luego el error ocurre en la fase de enlace de todos modos. Buena cosa. – alecov

+0

Bueno, código como si (x = 1) {...} es perfectamente legal, y sin embargo, una advertencia suele ser bienvenida. – fwyzard

3

La declaración extern en su archivo de encabezado permite que los módulos que no sean el en el que está definida la variable lo utilicen. Si se supone que debe definirse como int stack_counter = 0 y vivir en stack.c, defínalo así y ponga un extern stack_counter en el encabezado.

En la línea 6 de stack.c, no definió una clase de almacenamiento para sroot. Como está exterminado en el encabezado, supongo que quisiste escribir snode sroot=NULL.

Soluciona eso, luego implementa stackpush (asegúrate de que no se vuelva vacío) y maneja el resto de tus advertencias en orden. Tenga en cuenta que en C, debe usar declaraciones de funciones (con prototipos) o definir sus funciones antes de que se utilicen. La función cstack probablemente sea la última función en el archivo.

+0

Oh ok gracias por señalar estos errores He modificado mis declaraciones de archivos.h mis dos programas quiero publicarlos aquí pero no puedo ver ninguna etiqueta de código por la cual pueda publicar la cosa modificada hágamelo saber Quiero hablar más sobre esto, ya que cómo puse los programas c en mi respuesta para que el código sea legible en stackoverflow. Traté de agregar "backtick" y también "pero ninguno funcionó". –

+1

@Bond: no se puede hacer en los comentarios. Su mejor apuesta es actualizar la pregunta para reflejar los cambios. O bien, si realizó cambios que lo atascaron en otra parte, formule una nueva pregunta. – nmichaels

Cuestiones relacionadas