警告

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

Iは、上記のようにヘッダーファイル(declaration.h)を定義し、以下では、交流プログラム(stack.c) ある私は警告

#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) 
{ 

} 
を開発していライブラリで使用されるであろう作ってい

上記のファイルは両方とも同じディレクトリにあります。 私は私が私が私がその上の警告などの任意の考えていることですか、なぜ私は大胆にマークしているのexternとして変数を宣言したときに知りたいの警告

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 

を以下の上記のファイルstack.c cc -I ./ stack.cをコンパイルし、残っているエラーで他のものを共有したい場合は、私に知らせてください。

+0

最近の質問[extern変数を宣言とともにどのように定義するのか?](http://stackoverflow.com/questions/24436770/how-to-define-extern-variable-along-with-宣言) –

答えて

29

あなたのコードにはかなり重大で明白なエラー(他の回答ですでに説明しています)が含まれていますが、あなたの質問のタイトルに付けた警告は、まったく意味のない警告です。 GCCコンパイラは、無用な警告を出すことで有名です。これらの警告の多くは、何かをするのが何とか「間違っている」という無能で完全に実証されていない信念に由来しているようですが、現実には間違いはありません。

は、あなたのケースでは警告が

extern int stack_counter = 0; 

宣言によってトリガされます。どうやら、警告の "作者"は、extern指定子を定義していない宣言のために予約する必要があると信じていました。この場合、イニシャライザ= 0の存在は宣言を定義に変えます(したがって、正式にはexternはオプションになります)。それにもかかわらず、エラーはありません。実際には、stack_counterがグローバル変数であることを強調するために、externをここでは大歓迎します。

ここでもグローバル変数が必要かどうかは別の質問ですが、コードには他の多くのエラーが含まれています。しかし、あなたの注意を集中するように思われる警告は、本当に価値がありません。コンパイラの設定でこの警告を無効にしてください(GCCチームに無礼な手紙を書いてください)。

+5

公正であるために、これはリンカーエラー(多重定義)を予兆(および解決に役立つ)する警告です。たとえば、TU 1では、グローバルを作成してそれを割り当て、次にTU 2で宣言をコピーし、その宣言の前に 'extern 'を付加します。 externに存在する初期化は、externの意味を変え、この変数の2つのインスタンスを作成し、リンカーbarfsを生成させます。これは、あなたのポイントがそれほど有効ではないと言うわけではありませんが、存在するという警告が表示されます... –

+2

@StevenLu:GCCはエラーが発生する前に警告を出し、リンクフェーズでエラーが発生します。素晴らしいもの。 – alecov

+0

のようなコードの場合、(x = 1){...} は完全に合法ですが、通常は歓迎されます。 – fwyzard

3

ヘッダーファイルのextern宣言によって、変数が定義されているモジュール以外のモジュールでも使用できます。もしそれがint stack_counter = 0と定義され、stack.cに住んでいるとすれば、そのように定義し、ヘッダにextern stack_counterを入れます。

スタックCの6行目では、srootのストレージクラスを定義していませんでした。ヘッダーに記載されているので、snode sroot=NULLと入力することを前提としています。

これらの問題を修正してから、stackpushを実装してください(voidを返さないようにしてください)、残りの警告を順番に処理してください。 C言語では関数の前方宣言(プロトタイプ付き)を使用するか、関数を使用する前に関数を定義する必要があります。おそらくcstack関数がファイル内の最後の関数であるはずです。

+0

これらのエラーを指摘していただきありがとうございます ファイルの宣言を変更しました。h 私の両方のプログラム私はここにそれらを掲示したいが、私は変更されたものを投稿できるコードタグを見ることができません私はこれをさらに議論したいと知っています私はどのように私の返信そのため、コードはstackoverflowで読み取り可能です。私はバックティックを追加しようとしましたが、また誰も働いていませんでした。 –

+1

@Bond:コメントではできません。あなたの最善の策は、変更を反映するために質問を更新することです。あるいは、あなたが他の場所で動かないように変更した場合は、新しい質問をしてください。 – nmichaels