2012-08-08 8 views
5

header.c의 extern int x 변수에 액세스 할 수없는 header.c의 다음 코드에 특히 문제가 있습니다 ... 이유는 무엇입니까? .h의 extern 변수가 전역 변수가 아닌가? 이 파일을 다른 파일에 어떻게 사용할 수 있습니까?C 정의되지 않은 참조

=== header.h가 ===

#ifndef HDR_H 
#define HDR_H 

extern int x; 
void function(); 

#endif 

=== header.c ===

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

void function() 
{ 
    printf("%d", x); //****undefined reference to x, why?**** 
} 

===을 sample.c ===

int main() 
{ 
    int x = 1; 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
+1

주 함수에서'x' 전에'int'를 제거 할 수 있습니다. 이것은 전역 변수와 동일한 이름을 가진 주 함수에서 생성되는 새로운 지역 변수를 방지합니다 – bph

+0

(실수로 주석이 추가됨) –

+0

extern int에 대한 자세한 내용은 [http : // stackoverflow]를 참조하십시오.COM/질문/7,610,321/차분 간 통근-INT-A-통근-INT-A-42] [1] [1] : http://stackoverflow.com/questions/7610321/difference -inter-extern-int-a-extern-int-a-42 –

답변

1

extern은 변수를 선언하지만 정의하지는 않습니다. 기본적으로 컴파일러에게 x에 대한 정의가 있다는 것을 알려줍니다. main()에서 지역 변수 x 글로벌 변수 x을 숨길 것

int x; 

참고하십시오 header.c (또는 다른 .c 파일 만 하나 .c 파일)에 다음을 추가 수정합니다.

1

실제로 extern int x;x은 다른 장소/번역 단위로 정의됩니다.

컴파일러는 전체 범위 어딘가에 x의 정의를 찾으려고합니다.

3

키워드은 변수가 존재하지만 생성하지 않는다고 말합니다. 컴파일러는 다른 모듈이 그 이름을 가진 전역 변수를 가지기를 원하며, 링커는 이들을 합치는데 올바른 일을 할 것이라고 예상합니다.

/* x is a global exported from sample.c */ 
int x = 1; 

int main() 
{ 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
7

선언

extern int x; 

어떤 소스 파일에 x라는 글로벌 변수가있을 것입니다 컴파일러를 알려줍니다

는이 같은 sample.c을 변경해야합니다. 그러나 main 함수에서 로컬 변수 x을 선언합니다. 그 선언을 main 외부로 이동하여 전역으로 만듭니다.

0
내가/재구성과 같은 코드를 수정하고 header.c

===는 sample.h ===

#ifndef SAMPLE_H 
#define SAMPLE_H 

extern int x; 
void function(); 

#endif 

=== sample.c에 제거 할

===

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

int x; 

void function() 
{ 
    printf("%d", x); 
} 

int main() 
{ 
    x = 1; 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
+0

알았습니다! 모두에게 감사드립니다! – Analyn