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를 사용하십시오.
#include
C처럼 작동합니다 #include
.
#import
이미 포함 된 헤더를 추적하고 컴파일 단위로 헤더를 두 번 이상 가져 오는 경우 무시됩니다. 따라서 헤더 가드를 사용할 필요가 없습니다.
결론은 #import
Objective-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
과 거의 동일합니다 . 유일한 차이점은 동일한 파일이 두 번 이상 포함되지 않는다는 것입니다. 이는 헤더 가드를 포함하는 일반적인 기술 을 피하기위한 작은 편의성 입니다.#include
C
C
preprocessor
(가) 데 preprocessor
많은 소스 파일이 동일한 포함으로 프로젝트가 성장함에 따라 (전처리 헤더 파일, 매크로 확장, 조건부 컴파일 및 라인 제어를 포함하는 기능을 제공합니다.) 각 소스 파일의 각 헤더 파일을 구문 분석 빠르게 느리고 비효율적이된다 헤더 파일.
#import
이미 포함 된 헤더를 추적하고 컴파일 단위로 헤더를 두 번 이상 가져 오는 경우 무시됩니다. 따라서 헤더 가드를 사용할 필요가 없습니다.를 사용할 때
#import
헤더 포함 가드가 필요하지 않습니다. 그렇지 않으면 그냥 같습니다#include
.#include
동일한 파일을 여러 번 포함 할 수 있습니다.
Objective-C에서 파일 컴파일은 두 단계로 수행됩니다. 먼저 전처리 기가 파일을 통해 실행됩니다. 전 처리기의 출력은 실제 컴파일러로갑니다.
#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 번 입력하더라도 내부에 다시 선언되지 않습니다.
'Programming' 카테고리의 다른 글
Python 클래스에서 동등성 (“평등”)을 지원하는 우아한 방법 (0) | 2020.02.25 |
---|---|
오른쪽에서 왼쪽으로 슬라이드 하시겠습니까? (0) | 2020.02.25 |
MySQL 인덱스는 어떻게 작동합니까? (0) | 2020.02.25 |
까다로운 C 코드의이 네 줄에 대한 개념 (0) | 2020.02.25 |
package.json의 로컬 종속성 (0) | 2020.02.23 |