[c] C에서 extern 키워드를 올바르게 사용하는 방법

내 질문은 함수가 externC 의 키워드 로 참조되어야 할 때에 관한 것 입니다.

이것이 언제 실제로 사용되어야하는지 알지 못합니다. 프로그램을 작성할 때 사용하는 모든 기능을 포함 된 헤더 파일을 통해 사용할 수 있습니다. 그렇다면 extern헤더 파일에 노출되지 않은 항목에 액세스하는 것이 유용한 이유는 무엇입니까?

나는 어떻게 extern잘못 작동 하는지 생각할 수 있습니다 . 그렇다면 수정하십시오.

편집 :extern 헤더 파일에 키워드가없는 기본 선언 인 경우 뭔가 해야합니까 ?



답변

extern“는 연결을 변경합니다. 키워드를 사용하면 함수 / 변수가 다른 곳에서 사용 가능한 것으로 가정하고 해결이 링커로 지연됩니다.

함수와 변수에 대한 “extern”의 차이점이 있습니다. 변수에 대해서는 변수 자체를 인스턴스화하지 않습니다. 즉, 메모리를 할당하지 않습니다. 다른 곳에서 수행해야합니다. 따라서 다른 곳에서 변수를 가져 오려면 중요합니다. 함수의 경우, 이는 컴파일러에게 연결이 extern임을 알려줍니다. 이것이 기본값이므로 (키워드 “static”을 사용하여 함수가 extern linkage를 사용하여 바인딩되지 않았 음을 나타 내기 때문에) 명시 적으로 사용할 필요는 없습니다.


답변

extern 은이 데이터가 어딘가에 정의되어 있으며 링커와 연결될 것이라고 컴파일러에 알려줍니다.

여기에있는 답변의 도움으로 몇 명의 친구들과 이야기하는 것은 extern을 사용하는 실제적인 예입니다 .

예 1- 함정을 보여 주려면

File stdio.h:

int errno;
/* other stuff...*/

myCFile1.c:
#include <stdio.h>

Code...

myCFile2.c:
#include <stdio.h>

Code...

myCFile1.o 및 myCFile2.o가 링크 된 경우 각 c 파일에는 별도의 errno 사본이 있습니다. 링크 된 모든 파일에서 동일한 errno 를 사용할 수 있으므로 문제가됩니다 .

예 2- 수정 사항.

File stdio.h:

extern int errno;
/* other stuff...*/

File stdio.c

int errno;

myCFile1.c:
#include <stdio.h>

Code...

myCFile2.c:
#include <stdio.h>

Code...

이제 myCFile1.o와 MyCFile2.o가 모두 링커에 의해 연결되어 있으면 둘 다 동일한 errno를 가리 킵니다 . 따라서 extern으로 구현을 해결하십시오 .


답변

이미 extern키워드가 기능에 중복 되는 것으로 언급되었습니다 .

컴파일 단위에서 공유되는 변수의 경우 extern 키워드를 사용하여 헤더 파일로 변수를 선언 한 다음 extern 키워드없이 단일 소스 파일로 정의해야합니다. 모범 사례를 위해 단일 소스 파일은 헤더 파일 이름을 공유하는 것이어야합니다.


답변

몇 년 후, 나는이 질문을 발견했다. 모든 답변과 의견을 읽은 후 몇 가지 세부 사항을 명확히 할 수 있다고 생각했습니다. 이는 Google 검색을 통해 여기에 온 사람들에게 유용 할 수 있습니다.

문제는 “extern”함수 사용에 관한 것이므로 전역 변수와 함께 “extern”사용을 무시합니다.

3 가지 함수 프로토 타입을 정의 해 봅시다 :

//--------------------------------------
//Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
       int function_3(void);

헤더 파일은 다음과 같이 기본 소스 코드에서 사용할 수 있습니다.

//--------------------------------------
//Filename: "my_project.C"
#include "my_project.H"

void main(void){
    int v1 = function_1();
    int v2 = function_2();
    int v3 = function_3();
}

int function_2(void) return 1234;

컴파일하고 링크하기 위해서는 해당 함수를 호출하는 동일한 소스 코드 파일에서 “function_2″를 정의해야합니다. 다른 두 함수는 서로 다른 소스 코드 ” .C” 로 정의 되거나 소스 코드 가없는 바이너리 파일 ( .OBJ, * .LIB, * .DLL)에있을 수 있습니다.

차이점을 더 잘 이해하기 위해 다른 “* .C”파일에 “my_project.H”헤더를 다시 포함시켜 보겠습니다. 동일한 프로젝트에서 다음 파일을 추가합니다.

//--------------------------------------
//Filename: "my_big_project_splitted.C"
#include "my_project.H"

void old_main_test(void){
    int v1 = function_1();
    int v2 = function_2();
    int v3 = function_3();
}

int function_2(void) return 5678;

int function_1(void) return 12;
int function_3(void) return 34;

주목해야 할 중요한 기능 :

  • 함수가 헤더 파일에서 “정적”으로 정의되면 컴파일러 / 링커는 해당 포함 파일을 사용하는 각 모듈에서 해당 이름의 함수 인스턴스를 찾아야합니다.

  • C 라이브러리의 일부인 함수는 프로토 타입을 해당 모듈에서만 “정적”으로 재정 의하여 하나의 모듈에서만 대체 할 수 있습니다. 예를 들어, “malloc”및 “free”호출을 대체하여 메모리 누수 감지 기능을 추가하십시오.

  • 함수 “extern”지정자는 실제로 필요하지 않습니다. “정적”을 찾을 수 없으면 함수는 항상 “extern”인 것으로 가정합니다.

  • 그러나 “extern”은 변수의 기본값이 아닙니다. 일반적으로 많은 모듈에서 볼 수있는 변수를 정의하는 헤더 파일은 “extern”을 사용해야합니다. 헤더 파일이 하나의 모듈에서만 포함되는 것이 유일한 예외입니다.

    많은 프로젝트 관리자는 이러한 변수를 헤더 파일이 아닌 모듈의 시작 부분에 배치해야합니다. 비디오 게임 에뮬레이터 “Mame”과 같은 일부 대규모 프로젝트에서는 이러한 변수가 해당 변수를 사용하는 첫 번째 함수 위에 만 나타나도록 요구하기도합니다.


답변

C에서는 프로토 타입이 다른 곳에 정의 된 함수를 선언하기 때문에 함수 프로토 타입에는 ‘extern’이 내포되어 있습니다. 다시 말해 함수 프로토 타입에는 기본적으로 외부 연결이 있습니다. ‘extern’을 사용하는 것은 좋지만 중복됩니다.

정적 링크가 필요한 경우 함수는 프로토 타입과 함수 헤더 모두에서 ‘정적’으로 선언되어야하며 일반적으로 모두 동일한 .c 파일에 있어야합니다.


답변

extern키워드와 관련하여 다음과 같은 좋은 기사가 나와 있습니다. http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/

extern함수 선언에서 사용 하는 것이 중복 된다는 것에 동의하지는 않지만 . 이것은 컴파일러 설정으로되어 있습니다. 따라서 extern필요할 때 함수 선언에서를 사용하는 것이 좋습니다 .


답변

프로그램의 각 파일이 먼저 객체 파일로 컴파일 된 경우 객체 파일이 서로 연결되어 있어야합니다 extern. “이 함수는 존재하지만 그 코드는 다른 곳에 있습니다. 당황하지 마십시오.”