2016-06-07 5 views
0

나는 다음과 같은 한 세트 :C : 파일의 변수에 대한 이해 예상치 못한 beahvior

file1.h :

char* path = "C:\\temp" 

file2.c

#include "file1.h" 
char* getFilePath(){ 
    return path; 
} 

file3.c :

#include "file1.h" 
int main(){ 
    printf(" File path: %s",getFilePath); 
} 
extern char* path; 

을하고이 같은 file2.c에서 정의 :

char *path = "C:\\test" 
나는 위의 솔루션을 컴파일 할 때 내가 file1.hextern char* path;char* path을 변경하는 경우, 나는, 그러나

LNK2005 error `char *path` already defined 

를 얻을 수

다음 모든 게 잘 작동합니다. 그러나 행동의 차이를 이해할 수는 없습니다. 누군가 설명해 주시겠습니까? 수동 인 file2.c file3.c에 fileh.h의 내용을 포함하는 경우

+2

이것은 C++가 아니라 C입니다. 두 태그를 넣지 마십시오 – asimes

+0

file3.c에서'printf ("파일 경로 : % s", 경로);를 의미한다고 가정합니다. –

+0

귀하의 기대는 무엇입니까? – babon

답변

3

, 그들은 것입니다 :

와 file2.c :

// This is the definition of a global variable. 

char* path = "C:\\temp" 

char* getFilePath(){ 
    return path; 
} 

file3.c :

// This is the definition of a second global variable. 

char* path = "C:\\temp" 

int main(){ 
    printf(" File path: %s",getFilePath); 
} 

이 두 파일을 컴파일하고 링크하면 링커는 path이라는 두 개의 전역 변수를 보게됩니다. 이것이 링커 오류의 원인입니다. 당신이 file1.h에서

extern char* path; 

를 사용하는 경우

, 그것은 단순히 선언을 제공합니다. 변수는 필요한만큼 많은 컴파일 단위로 선언 할 수 있습니다. 한 번만 정의 할 수 있습니다. 따라서 path이 선언되어 file2.c에 정의되도록 file1.h를 변경하면 문제가 해결됩니다.