Programming

Objective-C에서 #import와 #include의 차이점은 무엇입니까?

procodes 2020. 2. 25. 22:52
반응형

Objective-C에서 #import와 #include의 차이점은 무엇입니까?


Objective-C에서 #import와 #include의 차이점은 무엇이며 다른 것을 사용해야하는 경우가 있습니까? 더 이상 사용되지 않습니까?

나는 다음 자습서를 읽고 있었다 : http://www.otierney.net/objective-c.html#preamble 및 # import에 대한 그 단락을 자체 모순 #INCLUDE 것 또는 적어도 불분명하다.


#import 지시문이 개선 된 버전의 #include로 Objective-C에 추가되었습니다. 그러나 개선 여부는 여전히 논란의 여지가 있습니다. #import를 사용하면 파일이 한 번만 포함되므로 재귀 포함에 문제가 발생하지 않습니다. 그러나 대부분의 괜찮은 헤더 파일은 어쨌든 이것으로부터 자신을 보호하므로 실제로 큰 이점은 아닙니다.

기본적으로 어떤 것을 사용할 것인지 결정하는 것은 귀하의 몫입니다. 나는 # 클래스 정의와 같은 Objective-C 것들에 대한 헤더를 가져오고 필요한 표준 C를 포함시키는 경향이 있습니다. 예를 들어, 소스 파일 중 하나가 다음과 같습니다.

#import <Foundation/Foundation.h>

#include <asl.h>
#include <mach/mach.h>

전처리 기와 관련하여 많은 혼란이있는 것 같습니다.

컴파일러가 #include그 줄을 포함 된 파일의 내용으로 바꾸는 것을 볼 때 컴파일러가하는 일, 질문은 없습니다.

따라서이 a.h내용을 가진 파일 있다면 :

typedef int my_number;

b.c이 내용을 가진 파일 :

#include "a.h"
#include "a.h"

파일 b.c은 컴파일하기 전에 전처리기에 의해 변환됩니다.

typedef int my_number;
typedef int my_number;

유형 my_number이 두 번 정의 되므로 컴파일러 오류가 발생 합니다. 정의는 동일하지만 C 언어에서는 허용되지 않습니다.

헤더는 종종 여러 곳에서 사용되므로 일반적으로 C 에서는 가드 가 사용됩니다.

 #ifndef _a_h_included_
 #define _a_h_included_

 typedef int my_number;

 #endif

파일 b.c은 전처리 후 여전히 헤더의 전체 내용을 두 번 포함합니다. 그러나 매크로 _a_h_included_가 이미 정의되었으므로 두 번째 인스턴스는 무시 됩니다.

이것은 실제로 잘 작동하지만 두 가지 단점이 있습니다. 먼저 포함 가드를 작성해야하며 매크로 이름은 모든 헤더에서 달라야합니다. 그리고 둘째로 컴파일러는 여전히 헤더 파일을 찾아서 포함 된대로 자주 읽어야합니다.

Objective-C에는 #import전 처리기 명령어가 있습니다 (일부 컴파일러 및 옵션과 함께 C 및 C ++ 코드에도 사용할 수 있음). 이것은와 거의 동일 #include하지만 내부에 어떤 파일이 이미 포함되어 있는지 기록합니다. #import라인은 단지 그것을 발생 처음으로 지정된 파일의 내용으로 대체됩니다. 그 후에는 그냥 무시됩니다.


나는 Jason에 동의합니다.

나는 이것을하고 잡혔다 :

#import <sys/time.h>  // to use gettimeofday() function
#import <time.h>      // to use time() function

GNU gcc의 경우 time () 함수가 정의되지 않았다고 계속 불평했습니다.

그래서 #import를 #include로 변경하고 모두 괜찮 았습니다.

이유:

#import <sys / time.h> :
    <sys / time.h>는 #defines를 사용하여 <time.h> 일부만 포함합니다

당신은 #import <time.h> :
    아닙니다. <import.h>의 일부만 이미 포함되어
    있지만 #import와 관련하여 해당 파일은 이미 완전히 포함되었습니다.

결론 :

C / C ++ 헤더는 전통적 으로 다른 포함 파일의 일부 를 포함합니다.
C / C ++ 헤더의 경우 #include를 사용하십시오.
objc / objc ++ 헤더의 경우 #import를 사용하십시오.


#includeC처럼 작동합니다 #include.

#import이미 포함 된 헤더를 추적하고 컴파일 단위로 헤더를 두 번 이상 가져 오는 경우 무시됩니다. 따라서 헤더 가드를 사용할 필요가 없습니다.

결론은 #importObjective-C 에서만 사용 되며 헤더가 두 번 이상 무언가를 가져 오는 경우 걱정하지 마십시오.


이 스레드는 오래 되었다는 것을 알고 있지만 "현대"에는 clang의 @import모듈을 통해 훨씬 뛰어난 "포함 전략" 이 있습니다. 종종 간과되고 있습니다.

모듈은 텍스트 전 처리기 포함 모델을보다 강력하고 효율적인 의미 론적 모델로 대체하여 소프트웨어 라이브러리의 API에 대한 액세스를 향상시킵니다. 사용자 관점에서 볼 때 코드는 #include 전 처리기 지시문 대신 가져 오기 선언을 사용하기 때문에 약간 다르게 보입니다.

@import Darwin; // Like including all of /usr/include. @see /usr/include/module.map

또는

@import Foundation;  //  Like #import <Foundation/Foundation.h>
@import ObjectiveC;  //  Like #import <objc/runtime.h>

그러나이 모듈 가져 오기는 해당하는 #include와 매우 다르게 동작합니다. 컴파일러가 위의 모듈 가져 오기를 볼 때 모듈의 이진 표현을로드하고 API를 응용 프로그램에서 직접 사용할 수있게합니다. 가져 오기 선언에 선행하는 전 처리기 정의는 제공된 API에 영향을 미치지 않습니다. 모듈 자체는 별도의 독립형 모듈로 컴파일 되었기 때문입니다. 또한 모듈을 가져 오면 모듈을 사용하는 데 필요한 링커 플래그가 자동 으로 제공됩니다. 이 의미 적 가져 오기 모델은 전 처리기 포함 모델의 많은 문제를 해결합니다.

모듈을 활성화하려면 컴파일 타임 명령 행 플래그 -fmodules일명 CLANG_ENABLE_MODULES전달하십시오 Xcode. 위에서 언급했듯이이 전략은 ANY와 ALL을 제거 LDFLAGS합니다. 마찬가지로 "링크"단계는 물론 "OTHER_LDFLAGS"설정을 제거 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

컴파일 / 실행 시간이 훨씬 더 "더 느리게"느껴지거나 (또는 ​​"링크"하는 동안 지연 시간이 줄어 듭니까? ") .. 또한 이제 외부의 Project-Prefix.pch 파일을 제거 할 수있는 좋은 기회를 제공합니다. 빌드 설정을 해당, GCC_INCREASE_PRECOMPILED_HEADER_SHARING, GCC_PRECOMPILE_PREFIX_HEADER, 및 GCC_PREFIX_HEADER

또한 잘 문서화되어 있지는 않지만… module.map자신 만의 프레임 워크를위한 프레임 워크를 만들어 같은 편리한 방식으로 포함시킬 수 있습니다. 이러한 기적을 구현하는 방법에 대한 예제는 ObjC-Clang-Modules github 저장소를 살펴보십시오.


C ++과 매크로에 익숙하다면

#import "Class.h" 

~와 비슷하다

{
#pragma once

#include "class.h"
}

이는 앱이 실행될 때 클래스가 한 번만로드됨을 의미합니다.


# .h 파일에 파일을 두 번 포함하면 컴파일러보다 오류가 발생합니다. 그러나 #import 파일을 두 번 이상 가져 오면 컴파일러에서이를 무시합니다.


경우에 .h따라 문제를 일으킨 파일 중 하나에 전역 변수가 extern있고 앞에 추가하여 문제를 해결할 수 있었습니다.


#import의해 사용되는 지시문 프로그래밍 언어 에서 상속 된 기본 메커니즘 Objective-C과 거의 동일합니다 . 유일한 차이점은 동일한 파일이 두 번 이상 포함되지 않는다는 것입니다. 이는 헤더 가드를 포함하는 일반적인 기술 을 피하기위한 작은 편의성 입니다.#includeCCpreprocessor

(가) 데 preprocessor많은 소스 파일이 동일한 포함으로 프로젝트가 성장함에 따라 (전처리 헤더 파일, 매크로 확장, 조건부 컴파일 및 라인 제어를 포함하는 기능을 제공합니다.) 각 소스 파일의 각 헤더 파일을 구문 분석 빠르게 느리고 비효율적이된다 헤더 파일.

  1. #import이미 포함 된 헤더를 추적하고 컴파일 단위로 헤더를 두 번 이상 가져 오는 경우 무시됩니다. 따라서 헤더 가드를 사용할 필요가 없습니다.

  2. 를 사용할 때 #import헤더 포함 가드가 필요하지 않습니다. 그렇지 않으면 그냥 같습니다 #include.

  3. #include 동일한 파일을 여러 번 포함 할 수 있습니다.

Objective-C에서 파일 컴파일은 두 단계로 수행됩니다. 먼저 전처리 기가 파일을 통해 실행됩니다. 전 처리기의 출력은 실제 컴파일러로갑니다.

사용 @import하는 대신


#include다른 파일에서 #include사용 된 파일로 "사물"을 가져 오는 데 사용됩니다. 예 :

파일에서 : main.cpp

#include "otherfile.h"

// some stuff here using otherfile.h objects,
// functions or classes declared inside

헤더 가드는 각 헤더 파일 (* .h)의 맨 위에 사용되어 동일한 파일이 두 번 이상 포함되지 않도록합니다 (발생하는 경우 컴파일 오류가 발생 함).

파일에서 : otherfile.h

#ifndef OTHERFILE
#define OTHERFILE

// declare functions, classes or objects here

#endif

#include코드 "otherfile.h"를 n 번 입력하더라도 내부에 다시 ​​선언되지 않습니다.

참고 URL : https://stackoverflow.com/questions/439662/what-is-the-difference-between-import-and-include-in-objective-c



반응형