2016-11-15 2 views
3

다음과 같이 내 문제를 보여주는 장난감 코드는 다음과 같습니다오류에게 "여러 정의"에 대한 해결 방법이 필요

stuff.h :

#ifndef STUFF 
#define STUFF 

int a; 
int testarr[]={1,2,3}; 

#endif 

fcn.h :

#include "stuff.h" 
int b[]={5,6,7}; 
void fcn(); 

주를 .h :

#include "stuff.h" 
#include <stdio.h> 

fcn.c :

#include "main.h" 

void fcn() { 
    printf("Hello\n"); 
} 

는 main.c를 :

#include "main.h" 
#include "fcn.h" 

int main() { 
    fcn(); 
    printf("HI\n"); 
} 

컴파일 시도가 실패합니다

/g/pe_19976/fcn_2.o:(.data+0x40): multiple definition of `testarr' 
/g/pe_19976/main_1.o:(.data+0x40): first defined here 

약간의 독서를하고 후에, 나는 헤더 파일에 배열 testarr을 정의하는 것은입니다 실현 문제. 하지만 실제 코드에서는 여러 파일이 testarr에 액세스해야하며 모든 곳에 동일한 값이 할당되어 있어야합니다. 나는 그것을 main.h (?)에 넣을 수 있다고 생각하지만, 실제로 작동한다면 내 실제 코드에서는 논리적으로 stuff.h에 속한다. 이 수수께끼를 어떻게 해결할 수 있습니까?

다른 말로하면, testarrextern으로 정의하려고 시도했지만 동일한 문제가 발생했습니다.

답변

0

너무 많은 전역 변수를 사용하는 이유가 명확하지 않습니다. 대응하는 헤더를 포함한다 (적어도 두 컴파일 단위가있는 사용자의 예에서) 컴파일 단위가있는 한 배열

int testarr[]={1,2,3}; 

은 여러 번 정의된다.

extern int testarr[3]; 

같은 헤더의 배열을 선언하고 CPP 모듈을 정의한다.

int testarr[]={1,2,3}; 

외부 링키지가있는 다른 전역 변수에도 동일하게 적용됩니다. 무엇인가에 따라이 발언 BTW

,에 관해서는

다른 내가 발견 나는 통근으로 testarr 정의하는 시도했지만 같은 문제가있어.

그런 다음 지정자 extern을 갖는 배열은 헤더에서 초기화되지 않습니다. 그렇지 않으면 배열의 정의입니다.

3

변수 정의를 헤더 파일에 넣으면 해당 변수를 포함하는 .c 파일에 해당 변수의 복사본이 있습니다. 그런 다음 링크를 시도하면 다중 정의 오류가 발생합니다.

헤더 파일에는 변수의 선언 만 포함되어야합니다. 이 작업은 extern 키워드를 사용하며 초기화 프로그램은 사용하지 않습니다.

정확히 하나의 .c 파일에 선택 사항 인 초기화 프로그램과 함께 정의를 넣습니다.

의 main.c :

#include "main.h" 
#include "fcn.h" 

int a; 
int testarr[]={1,2,3}; 

int main() { 
    fcn(); 
    printf("HI\n"); 
} 

stuff.h :

#ifndef STUFF 
#define STUFF 

extern int a; 
extern int testarr[]; 

#endif 

fcn.h :

#include "stuff.h" 
extern int b[]; 
void fcn(); 

fcn.c :

#include "main.h" 

int b[]={5,6,7}; 

void fcn() { 
    printf("Hello\n"); 
} 
관련 문제