2010-11-24 10 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; 

je définissais un fichier d'en-tête (declaration.h) comme ci-dessus et ci-dessous est un programme alternatif (de stack.c) je fais qui serait utilisé dans la bibliothèque, je développeavertissement dans la déclaration 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) 
{ 

} 

les deux fichiers ci-dessus sont dans le même répertoire. Je compilé le fichier ci-dessus stack.c cc -I ./ stack.c I avertissements suivants

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 

Je veux savoir quand je déclarais une variable extern que j'ai marqué gras pourquoi est-ce que je reçois comme un avertissement toute pensée à ce sujet et Si quelqu'un veut partager une autre chose sur les erreurs restantes alors faites le moi savoir.

+0

Voir aussi la question beaucoup plus récente [Comment définir la variable 'extern' avec déclaration?] (Http://stackoverflow.com/questions/24436770/how-to-define-extern-variable-along-with- déclaration) –

Répondre

29

Alors que votre code contient un certain nombre d'erreurs assez graves et évidentes (déjà couvertes dans d'autres réponses), l'avertissement que vous mettez dans le titre de votre question est un avertissement complètement inutile et sans objet. Le compilateur GCC est connu pour émettre des avertissements inutiles. Beaucoup de ces avertissements semblent provenir de la croyance incompétente et complètement non fondée de quelqu'un que faire quelque chose est en quelque sorte "faux", alors qu'en réalité il n'y a rien de mal à cela.

Dans votre cas, l'avertissement est déclenché par

extern int stack_counter = 0; 
déclaration

. Apparemment, l '"auteur" de l'avertissement croyait que le spécificateur extern devrait être réservé aux déclarations non définissantes. Dans ce cas, la présence de l'initialiseur = 0 transforme la déclaration en définition (et rend ainsi formellement extern optionnel). Néanmoins, il n'y a pas d'erreur et, en fait, extern pourrait être bienvenu ici pour souligner le fait que stack_counter est destiné à être une variable globale.

Encore une fois, que vous ayez besoin d'une variable globale ici ou non est une question différente et, encore une fois, votre code contient un grand nombre d'autres erreurs. Mais l'avertissement sur lequel vous semblez concentrer votre attention n'en vaut pas vraiment la peine. Il suffit de désactiver cet avertissement dans les paramètres du compilateur (et, s'il vous plaît, écrivez une lettre grossière à ce sujet à l'équipe GCC).

+5

Pour être juste, c'est un avertissement qui peut présager (et aider à résoudre) une erreur de lien (définition multiple). Par exemple ... dans TU 1 on crée un global et on l'assigne, puis dans TU 2 on copie la déclaration et ensuite on ajoute "extern" à cette déclaration. L'initialisation étant présente avec extern fait que l'extern signifie quelque chose de différent et provoque donc la création de deux instances de cette variable et la barre de liaison ... Cela ne veut pas dire que votre point soit moins valide, mais c'est probablement la raison l'avertissement à exister ... –

+2

@StevenLu: Donc, GCC avertit avant que l'erreur se produise, et puis l'erreur se produit à la phase de liaison de toute façon. Des trucs géniaux. – alecov

+0

Eh bien, code comme si (x = 1) {...} est parfaitement légal, et pourtant un avertissement est généralement le bienvenu. – fwyzard

3

La déclaration extern dans votre fichier d'en-tête permet à des modules autres que celui dans lequel la variable est définie de l'utiliser. S'il est supposé être défini comme int stack_counter = 0 et que vous résidez dans stack.c, définissez-le comme cela et placez un extern stack_counter dans l'en-tête.

Sur la ligne 6 de stack.c, vous n'avez pas défini de classe de stockage pour sroot. Comme il est externalisé dans l'en-tête, je suppose que vous vouliez saisir snode sroot=NULL.

Corrigez-les, puis implémentez stackpush (assurez-vous qu'il ne renvoie pas void) et traitez le reste de vos avertissements dans l'ordre. Notez qu'en C, vous devez utiliser des déclarations de fonctions avancées (avec des prototypes) ou définir vos fonctions avant qu'elles ne soient utilisées. La fonction cstack devrait probablement être la dernière fonction du fichier.

+0

Oh ok merci de signaler ces erreurs J'ai modifié mes déclarations de fichier.h mes deux les programmes que je veux les poster ici mais je ne suis pas en mesure de voir un code par lequel je peux poster la chose modifiée laissez-moi savoir que je veux discuter plus loin comment mettre les programmes c dans ma réponse de sorte que le code est lisible sur stackoverflow. J'ai essayé d'ajouter backtick 'et aussi 'mais aucun n'a fonctionné. –

+1

@Bond: Ne peut être fait dans les commentaires. Votre meilleur pari est de mettre à jour la question pour refléter les changements. Ou, si vous avez fait des changements qui vous ont coincés ailleurs, posez une nouvelle question. – nmichaels

Questions connexes