2014-02-23 1 views
1

.m 파일은 구현 위치이며 .h 파일은 메소드 서명 등을 알고 있습니다. 클래스에서 특정 클래스를 사용하려면 .h 파일을 가져옵니다. 전 처리기는 가져 오기 .h 파일을 .h 파일의 내용으로 바꿉니다. 내가 이해하지 못하는 것은 구현에 대한 액세스가 .h 컨텐츠를 가져 오는 전처리 기에서 사용 가능하게되는 방법입니다. 이것을 허락하는 런타임 메커니즘은 무엇입니까?.h와 .m 파일의 관계는 무엇입니까?

+1

컴파일 및 링크 작동 방법을 배워야합니다. – bneely

+2

@bneely 그런 snide 코멘트를 제공하는 대신 주제에 대한 적절한 소개에 링크하지 않으시겠습니까? http://stackoverflow.com/questions/6264249/how-does-the-compilation-linking-processworkwork –

+0

그건 소급 코멘트로 의도되지 않았습니다; 적절한 링크가 여기에 기여하는 것이 옳다는 것에 동의합니다. – bneely

답변

5

.h 파일을 가져 오는 것이 실제로 그렇게하는 것이 아니므로 혼동하지 않으셔도됩니다.

프로그램을 컴파일 할 때 각 파일은 "개체 파일"로 컴파일되고 모두 실행 가능 프로그램으로 연결됩니다. 이 링크 단계는 구현에 대한 액세스를 제공합니다.

마찬가지로, 사용하는 모든 라이브러리는 링크해야합니다 (Xcode의 프로젝트 템플릿은 Foundation, UIKit/AppKit 및 기타 공용 라이브러리를 위해이 작업을 수행합니다). 이러한 유형의 연결은 컴파일시 부분적으로 수행 된 다음 응용 프로그램이 시작될 때 동적으로 완료되므로 컴파일 된 버전 대신 OS에 포함 된 라이브러리의 버전을 가져옵니다.

헤더를 가져 오면 컴파일러는 링크 된 라이브러리에 어떤 항목이 있는지 쉽게 알 수 있으므로 컴파일러는이를 참조하는 코드를 컴파일 할 수 있습니다. 컴파일러가 (dlopen, dlsym, NSClassFromString, NSSelectorFromString 등을 통해) 컴파일러를 수행하는 대신 동적으로 사용하는 기능을 조회하면 헤더를 가져 오지 않고 링크 된 코드를 사용할 수 있습니다.

관련 문제