2016-09-30 14 views
1

C言語を使用してプログラムでスタックを実装しようとしています。私はそれらを3つのファイルに分けます。.cファイルに.hファイルを含めるとLNK2005が発生する

最初に、stack.hファイル。スタックにはPop、Pushなどの必須の宣言と関数が含まれています。 第2に、stack.cファイル。これは、stack.hファイル内の関数を実装するファイルです。私の場合は、動的配列を使ってスタックを実装します。 第3に、main.cファイル。スタックを使用して計算を行う場所です。

しかし、私はLNK2005(... objで既に定義されています)の末尾にコンパイルエラーが発生します。私は、このエラーは複数の定義が存在する場合に起こることを知っています。しかし、.h/.cファイルで同じ関数名を持つ多くの例を見ましたが、エラーは発生しませんでした。あなたのための親切な注意

LNK1169 one or more multiply defined symbols found 
LNK2005 _CreateStack already defined in main.obj 
LNK2005 _IsEmpty already defined in main.obj 
LNK2005 _Pop already defined in main.obj 
LNK2005 _Push already defined in main.obj 
LNK2005 _StackDepth already defined in main.obj 

ありがとう:ここ

はエラーログです。 ここに私のstack.hファイルがあります。

typedef struct Stack Stack; 

Stack* CreateStack(); 
void Push(Stack *s, char InputString); 
void Pop(Stack *s); 
int StackDepth(Stack *s); 
int IsEmpty(Stack *s); 

ここに私のstack.cファイルがあります。ここで

#include "stack.h" 

typedef struct Stack{ 
    ..... 
    ..... 
} 

Stack* CreateStack(){ 
    ...... 
}; 

void Push(Stack *s, char InputString){ 
    .... 
    .... 
} 

void Pop(Stack *s){ 
    .... 
}; 

int StackDepth(Stack *s){ 
    .... 
}; 

int IsEmpty(Stack *s){ 
    .... 
}; 

は私のmain.cファイルには、あなたがあなたのメインのファイルで、あなたのCファイルが含まれている

#include<stdio.h> 
#include"stack.c" 
#include"stack.h" 

int main(){ 
    .... 
    .... 
    .... 
    return 0; 
} 
+0

あなたの質問を編集して実際のリンクエラーを表示できますか?あなたの関数定義の最後にセミコロンを置くと、それらは役に立たない。 –

+0

ありがとうございました。よく編集されました。 – Hugo

答えて

0

です。 #includeディレクティブは、指定されたファイルの内容全体を、#includeディレクティブがある場所にテキストで貼り付けるように、プリプロセッサに指示します。これは、stack.cファイルからの関数の実装が、stack.cファイルとmain.cファイルの両方としてコンパイルされていることを意味します。これは、リンカーから指示されるように2回実装されています。 コンパイラはあいまいさを扱うことができません。呼び出しに2つの一致する関数があり、そのうちの1つをランダムに選択する代わりにエラーを返します。

#includeファイルは、ヘッダー(.h)ファイルのみです。

+0

ありがとうございます。本当にこれについて何かを学んでください。 "stack.h"のみが私の質問を完全に解決しました。 – Hugo

+0

@Hugoあなたは大歓迎です:) – immortal

関連する問題