在.c文件中包含.h文件时会发生LNK2005

时间:2016-09-30 14:35:03

标签: c compiler-errors header stack lnk2005

我正在尝试使用C语言在程序中实现Stack。我将它们分成3个文件。

首先,stack.h文件。它包括一些基本的声明和功能,如Pop,Push for a stack。 第二,stack.c文件。它是一个文件实现stack.h文件中的函数。在我的例子中,我使用动态数组实现我的堆栈。 三,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;
}

1 个答案:

答案 0 :(得分:0)

您已将C文件包含在主文件中。 #include指令告诉预处理器以文本方式将指定文件的整个内容粘贴到#include指令所在的位置。这意味着您的stack.c文件中的函数实现现在作为stack.c文件和main.c文件的一部分进行编译 - 实现两次,如链接器所示。 编译器无法处理歧义 - 调用有2个匹配函数,它返回错误而不是随机选择其中一个。

你永远不应该#include C文件,只有标题(.h)文件。