몇 년 후, 나는이 질문을 발견했다. 모든 답변과 의견을 읽은 후 몇 가지 세부 사항을 명확히 할 수 있다고 생각했습니다. 이는 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"과 같은 일부 대규모 프로젝트에서는 이러한 변수가 해당 변수를 사용하는 첫 번째 함수 위에 만 나타나도록 요구하기도합니다.