2014-02-14 2 views
4

이런 종류의 질문에 사과드립니다. 그러나 키워드 externC\C++에 매우 궁금합니다.c/C++에서 extern을 사용하는 개념은 무엇입니까?

extern에 대한 설명을 검색하면서 extern은 변수 또는 함수가 이미 다른 파일이나 프로그램에 정의되어 있음을 컴파일러에 알립니다.

하지만 그렇다면 extern을 사용해야하는 이유는 무엇입니까?

다음과 같이 내가 몇 가지 코드를 시도 같이

extern int var; 
int main(void) 
{ 
var = 10; 
return 0; 
} 

이 코드는 unresolved external symbol "int var" ([email protected]@3HA)로 나에게 오류 메시지를주고있다.

와 내가 좋아하는 몇 가지 코드를 사용하고있는 경우 : 그것은 오류를 보여주는 내가 주요 기능에 정의 된대로 같은 값을 제공하지 않습니다

extern int var; 
int main(void) 
{ 
int var = 10; 
return 0; 
} 

.

그래서 어떤 사람이 extern의 동작에 대해 도움이 될 수 있습니까? 나는 이것을 거의 혼란스러워합니다. 유효한 질문이 아닌 경우 용서하시기 바랍니다. 사전 감사합니다. 당신은 또한 글로벌 범위

int var; 

을 가지고 다른 C 파일과 연결하여 extern -declared 변수, 즉의 정의를 제공해야하기 때문에

+0

'extern int var'는 선언이고,'var'에 메모리를 할당하지 않으므로'var = 10'을 사용할 때 프로그램은'var'의 정의를 검색하지만 찾을 수 없습니다. –

+0

@ jalf : 답장을 보내 주셔서 감사합니다. –

답변

5

extern은 다른 번역 단위 ("원본 파일")의 변수를 나타내는 데 사용됩니다. 예를 들어 은 main.c에있는 코드는 다음과 같습니다 :이 코드는 정수의 이름 VAR에 대한 선언,하지만 정의를 포함

extern int var; 
int main(void) 
{ 
    var = 10; 
    return 0; 
} 

, 통근 명시 적으로 말한다 때문에 "이것에 대한 정의는 다른 곳이다" 당신이 당신의 빌드 명령이 새 번역 단위를 추가 한 후 프로그램이 잘 연결됩니다, 그리고

int var = 0; 

, 그리고 두 파일의 코드 :

당신은, 말하자면, other.c 다른 소스 파일을 정의 할 수 있습니다 공유 된 012에서 작동 할 수 있습니다.변수입니다.

두 번째 버전에서는 주 기능의 로컬 변수로 extern var의 선언을 무시합니다. extern var이 (ODR-) 더 이상 사용되지 않으므로 링커에서 필요로하지 않으므로 실행 파일을 성공적으로 빌드 할 수 있습니다.

+0

. 그러나 다른 파일에서'int var;'변수를 정의하면'int var redefinition'으로 에러가 발생합니다. 내 코드에 다른 파일을 포함해야합니까? –

+0

다른 파일은'# include' 문에 "포함"되어서는 안됩니다. 두 원본 파일의 변환으로 인해 생성 된 개체 파일은 링커에서 함께 연결해야합니다. –

+0

고마워, 나에게 많은 도움이된다. –

3

첫 번째 버전은 실패합니다.

int var = 10; 라인이 main()shadows 전역 선언 이후에 성공했습니다. 변수를 extern, 즉 많은 C 파일에서 공유하려는 경우 일반적으로 나쁜 일입니다. 물론 이러한 공유 자체는 종종 너무 나쁩니다 (참조 : global variables).

1

extern은 변수가 다른 컴파일 단위에 있음을 나타내는 데 사용됩니다.당신이 가지고있는 경우 :

MAIN.CPP

extern int var; 
int main(void) 
{ 
var = 10; 
return 0; 
} 

과 :

var.cpp 그런

int var; 

당신은 같은 링커 오류가 발생했습니다 않았을 것이다 링커가 main.cpp에 var을 사용했을 때 var.cpp의 decleration을 사용했을 것입니다.

두 번째 예에서는 extern int var을 정의했지만 결코 참조하지 않습니다. int var = 10은 extern과 완전히 다른 int var입니다. 링커가 실행될 때 extern int var 변수를 절대로 사용하지 않는다는 사실을 알게되므로 검색하기가 번거롭지 않습니다.

0

변수 선언 extern은 변수의 실제 인스턴스가 다른 위치에 있음을 컴파일러에 알립니다. 다른 곳에서 제공하지 않으면 연결 단계가 실패합니다.

두 번째 예제에서는 extern 선언 된 변수를 전혀 참조하지 않습니다. 전역 선언을 어둡게하는 주요 함수의 범위에서 새로운 것을 선언합니다.

1

변수 정의 및 선언에 대한 이해를 분명히해야합니다.

extern 키워드는 변수가 선언 된 메모리 만 할당되었다고 말할 때 사용됩니다.

extern 키워드 컴파일러를 사용하여 any 변수를 선언하면 선언 앞뒤에 존재할 수있는 동일한 변수의 정의를 찾으려고 시도합니다.

첫 번째 경우 변수를 선언하지 않고 메모리를 할당하지 않고 변수를 정의하지 않습니다.

this을 통해 extern 키워드를 더 잘 이해할 수 있습니다. 당신이 전역 변수를 선언 한 경우

1

C에서

extern double myvar; 

같은 ++를,의는 file1.cpp에서 double myvar=5을 가정 해 봅시다 당신은 다음 file2.cpp 당신이 선언 file2.cpp에서 그 변수에 액세스하려면, 각 파일을 컴파일 단위라고합니다. 파일을 오브젝트 파일로 컴파일하려면 선언 된 모든 변수가 필요하지만 초기화하거나 해당 변수에 대입 할 필요가 없습니다.

예제로 돌아 :

File1.cpp : double myvar=5을이 선언과 초기화 둘 다이다. file1.cpp를 file1.o로 컴파일 할 수 있습니다.

File2.cpp : file2.cpp 어딘가에 myvar을 사용하고 file1.cpp에서 값을 액세스하려고한다고 가정합니다. 따라서 file2.cpp를 file2.o로 컴파일하려면 extern double myvar을 선언해야 file2.cpp를 컴파일 할 수 있습니다. 이것은 컴파일러를 기쁘게 할 것이고 링커에게 맡길 것이다.

이러한 파일을 컴파일 했으므로 g ++를 사용하는 경우 file1.o 및 file2.o라는 이름의 개체 파일 (번역 단위)을 갖게됩니다. 이제 링크를 연결하고 file2.o가 myvar에 액세스하도록하는 것이 링커의 임무입니다.

관련 문제