2016-09-30 10 views
1

C 언어를 사용하여 프로그램에서 스택을 구현하려고합니다. 나는 그들을 3 개의 파일로 분리한다..c 파일에 .h 파일을 포함하면 LNK2005가 발생합니다.

먼저 stack.h 파일. 여기에는 Pop, Push와 같은 필수 선언과 함수가 스택에 포함됩니다. 두 번째로 stack.c 파일. stack.h 파일 안에 함수를 구현 한 파일이다. 필자의 경우 동적 배열을 사용하여 스택을 구현한다. 셋째, 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 파일의 일부로 컴파일되며 링커에서 알려주므로 두 번 구현됩니다. 컴파일러는 모호성을 처리 할 수 ​​없습니다. 호출에 대해 일치하는 함수가 두 개 있으며 임의로 하나를 선택하는 대신 오류를 반환합니다.

#include 파일은 헤더 파일 (.h)에만 사용하면 안됩니다.

+0

감사합니다. 이것에 관해 실제로 배웁니다. "stack.h"만 내 질문을 완벽하게 해결했습니다. – Hugo

+0

@Hugo 당신이 가장 환영합니다 :) – immortal