헤더 (.h) 파일에 함수를 선언합니다. 그런 다음 해당 헤더 파일은 기능을 사용해야하는 다른 파일에서 #include
을 가져옵니다. 컴파일러는 함수의 서명과 호출 방법을 알고 있기 때문에 컴파일러를 만족시킵니다.
이 함수는 소스 (.cpp) 파일에 정의됩니다. 소스 파일에는 자체 헤더 파일이 포함되어 있으므로 컴파일 할 때 해당 함수의 전체 컴파일 된 코드가 포함 된 객체 파일로 끝납니다.
링커는 함수를 호출 한 코드의 일부 (즉, 헤더를 포함하는 파일)와 해당 함수의 실제 코드를 연결합니다. 예와
편집 :
Foo.h :
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
int fooFunction(double a);
};
#endif
foo.cpp의 :
#include "Foo.h"
int Foo::fooFunction(double a)
{
// Function definition
return 1;
}
이 Foo.cpp
컴파일은 완전한 정의 FO를 포함 Foo.obj
를 생성 r fooFunction
. 여태까지는 그런대로 잘됐다.
Bar.h :
#ifndef BAR_H
#define BAR_H
#include "Foo.h"
class Bar
{
public:
void barFunction();
};
#endif
Bar.cpp는 :
#include "Bar.h"
void Bar::barFunction()
{
Foo foo;
int returnValue = foo.fooFunction(2.0);
}
Bar.cpp
차례로 Foo.h
포함 Bar.h
포함한다. 따라서 Bar.cpp
이 사전 처리되면 Foo::fooFunction
에 대한 선언이 파일의 맨 위에 삽입됩니다. 따라서 문 int returnValue = foo.fooFunction(2.0);
이 컴파일되면 컴파일러는 반환 값 (int
)의 유형을 알고 매개 변수의 유형 (double
및 암시 적 this
포인터)을 알고 있기 때문에 fooFunction
을 호출하는 기계 명령어를 내보내는 방법을 알고 있습니다 foo
개체의 경우). 함수 정의가 제공되지 않았기 때문에 함수는 인라인되지 않습니다 (인라인이란 함수의 전체 코드가 호출되는 지점으로 복사됨을 의미합니다). 대신 함수의 메모리 주소를 가리키는 포인터가 사용됩니다. 포인터가 사용 중이기 때문에 컴파일러는 정의를 신경 쓰지 않습니다. 알아야 할 것은 모두 입니다. "매개 변수 A와 B를 사용하여 메모리 위치 Y에서 함수 X를 호출해야하고 크기가 int
이어야합니다. 메모리 섹션에 반환 값을 저장할 준비가되어 있고 그 주소의 코드가 ""함수를 수행하는 방법을 알고 있다고 가정합니다. 그러나 컴파일러는 함수 정의가 별도의 .cpp
파일에 있고 별도의 컴파일 작업 AKA 번역 단위의 일부이기 때문에 사전에 해당 함수의 주소를 알 수있는 방법이 없습니다.
그게 링커가 들어오는 곳입니다. 모든 번역 단위가 컴파일되면 (임의의 순서 일 수 있음) 링커는 Bar.cpp
의 컴파일 된 코드로 돌아가서 fooFunction
의 컴파일 된 정의는 Bar.cpp
에서 호출되어 컴파일 된 코드를 완전히 실행 가능하게 만듭니다.
샘플 코드가 없으면 질문이 전혀 없습니다. 함수는 .ht로 선언되고, .cpp 파일로 작성되며, 호출하는 변수에는 모든 관련 유형이 있으며, 컴파일러는 모든 참조를 해석합니다. 뭐가 문제 야? – abelenky
이 질문 (및 기타 매우 기본 질문)은 초보자 C++ 서적에 대한 답변을 제공합니다. [여기] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) 및 [여기] (http://stackoverflow.com/questions/194812/list-list- 자유 - 이용 - 프로그래밍 - 프로그래밍 서적). – JBentley
자바와 같은 방식입니다. 링커가 해결합니다. 특정 클래스에 있다는 것을 알고 있기 때문에 함수가 어디에 메모리에 있는지 알 수있는 것은 아닙니다. 그래서 런타임에 이름을 메모리 위치로 변환해야합니다. 이것은 런타임 링커에 의해 수행됩니다. 주 : Java에서는 클래스 로더가 개념 레벨에서이 작업을 수행합니다. –