1

C言語を使用してプログラムにスタックを実装しようとしています。それらを3つのファイルに分けます。

まず、stack.h ファイル。スタックのPop、Pushなど、いくつかの重要な宣言と関数が含まれています。次に、stack.c ファイル。stack.h ファイル内の関数を実装したファイルです。私の場合、動的配列を使用してスタックを実装します。3 つ目は、main.c ファイルです。ここで Stack を使用して計算を行います。

しかし、最後に 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ファイルです

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

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

1 に答える 1

1

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

C ファイルは使用しないでください#include。ヘッダー (.h) ファイルのみを使用してください。

于 2016-09-30T14:53:41.170 に答える