목표 C에 #import와 #include의 차이점은 무엇입니까?
#import와 #Objective-C의 #include의 차이점은 무엇입니까?또, 어느쪽인가를 다른쪽을 사용할 필요가 있는 경우도 있습니까?한 명은 추천되지 않나요?
저는 다음 튜토리얼을 읽고 있었습니다.http://www.otierney.net/objective-c.html#preamble과 #import와 #model에 관한 패러그래프는 모순되거나 적어도 불분명한 것 같습니다.
프리프로세서에 대해 많은 혼란이 있는 것 같습니다.
가 「」를 ,#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에서는 include guards가 사용됩니다.이것은 다음과 같습니다.
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
일b.c
전처리 후 헤더의 전체 내용이 두 번 들어있을 것입니다. 두 가 있기 됩니다._a_h_included_
이미 정의되었을 것입니다.
이것은 매우 잘 작동하지만 두 가지 단점이 있습니다.먼저 include guards를 기입하고 각 헤더에서 매크로 이름을 다르게 해야 합니다.그리고 두 번째로 컴파일러는 여전히 헤더 파일을 찾아 포함된 만큼 자주 읽어야 합니다.
는 Objective-CΩ을 .#import
프리프로세서 명령(일부 컴파일러 및 옵션과 함께 C 및 C++ 코드에도 사용할 수 있습니다).은 거의 합니다.#include
또한 이미 포함된 파일도 내부적으로 기록합니다.#import
행은 처음 발견된 파일 내용으로만 대체됩니다.그 후 매번 그것은 무시된다.
#include의 개량판으로 #import 디렉티브가 Objective-C에 추가되었습니다.그러나 개선 여부는 여전히 논쟁의 대상이다.#import는 파일이 한 번만 포함되므로 재귀적 포함에 문제가 없습니다.그러나 대부분의 괜찮은 헤더 파일은 이 문제에 대해 스스로를 보호하므로 그다지 큰 이점이 없습니다.
기본적으로 어떤 것을 사용할지 결정하는 것은 당신에게 달려 있습니다.Objective-C의 경우 #import 헤더(클래스 정의 등)와 #필요한 표준 C의 경우 #import 헤더를 사용하는 경향이 있습니다.예를 들어 소스 파일 중 하나는 다음과 같습니다.
#import <Foundation/Foundation.h>
#include <asl.h>
#include <mach/mach.h>
나는 제이슨 말에 동의해.
이런 짓을 하다가 들켰어요
#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 > 에는 <time>의 일부만 포함됩니다.h> #syslog를 사용하여
# Import < time > : h > :
>의이지만. < > > > 、 > ash > > 、 > 、 > 、 > 、 > 、 > 、 >>>>hhh already already already 。
#import에 관한 한 이 파일은 이미 완전히 포함되어 있습니다.
결론:
C/C++ 헤더에는 일반적으로 다른 포함 파일의 일부가 포함되어 있습니다.
C/C++는 #include #include 입니다.
에는 #objc/objc++ 를
#include
C 와 works works works works works works works works the works works works works works works works works works works#include
.
#import
는 이미 포함된 헤더를 추적하여 컴파일 유닛에서 헤더를 여러 번 Import하면 무시됩니다.따라서 헤더 가드를 사용할 필요가 없습니다.
은 그냥 입니다.#import
Objective-C의 Import.
이 실이 오래됐다는 건 알아'근대'에서는...Clang의 모듈을 통해 훨씬 뛰어난 "유효한 전략"이 있습니다.그것은 종종 간과되고 있습니다.
모듈은 텍스트 프리프로세서 포함 모델을 보다 견고하고 효율적인 의미 모델로 대체함으로써 소프트웨어 라이브러리의 API에 대한 접근을 개선합니다.사용자의 관점에서 보면 #include preprocessor 디렉티브가 아닌 Import 선언을 사용하기 때문에 코드는 약간 다를 뿐입니다.
@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>
단, 이 모듈의 Import 동작은 대응하는 #include와는 상당히 다릅니다.컴파일러가 위의 모듈의 Import를 확인하면 모듈의 바이너리 표현을 로드하여 응용 프로그램에서 API를 직접 사용할 수 있도록 합니다.Import 선언 앞에 있는 프리프로세서 정의는 제공된 API에 영향을 주지 않습니다.모듈 자체가 독립된 스탠드아론 모듈로 컴파일되었기 때문입니다.또한 모듈을 사용하기 위해 필요한 링커플래그는 모듈을 Import할 때 자동으로 제공됩니다.이 시맨틱 Import 모델은 프리프로세서 포함 모델의 많은 문제를 해결합니다.
모듈을 활성화하려면 명령줄 플래그를 전달합니다.-fmodules
아카CLANG_ENABLE_MODULES
에Xcode
- 컴파일 시.전술한 바와 같이..이 전략은 모든 것을 배제합니다.LDFLAGS
에서와 같이 "OTHER_LDFLAGS" 설정 및 "Linking" 단계를 삭제할 수 있습니다.
컴파일/기동 시간이 훨씬 빨라졌습니다(혹은 링크 중에 지연이 줄어들었을 수도 있습니다).또, 현재는 관계가 없는 Project-Prefix.pch 파일 및 대응하는 빌드 설정을 삭제할 수 있는 절호의 기회이기도 합니다.GCC_INCREASE_PRECOMPILED_HEADER_SHARING
,GCC_PRECOMPILE_PREFIX_HEADER
, , , , 입니다.GCC_PREFIX_HEADER
등등.
「 」 「 」 、 「 」 。 수 있어요.module.map
사용자 고유의 프레임워크에 적합하고 동일한 방식으로 포함시킵니다.ObjC-Clang-Modules github repo에서 이러한 기적을 구현하기 위한 몇 가지 예를 볼 수 있습니다.
C++ 및 매크로에 정통한 경우
#import "Class.h"
와 유사하다
{
#pragma once
#include "class.h"
}
즉, 앱 실행 시 클래스가 한 번만 로드됩니다.
#파일을 .h파일에2번포함하면 컴파일러보다 에러가 발생합니다.그러나 #1개의 파일을 여러 번 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
"code 파파니hhhhhh. 이 .h" n 시간, 코드 내 이 시간은 다시 선언되지 않습니다.
제가 글로벌 수도 있어요..h
이 되고 있는 , 저는 이 했습니다.extern
에서.
#preposure vs #import preprocessor 명령어
이력:
#include -> #import -> [사전 컴파일된 헤더 .pch] -> [@import Module (ObjC);] -> [import Module (Swift)]
#import
제품이다#include
해결됩니다.double inclusion
★★★★★★★★★★★★★★★★★」recursive includes
현재 .h 파일의 경우.포함된 의 복사본 1개만.h
의 body()
#import == #include + guard
경비원은 처럼 보인다
#ifndef <some_unique_name>
#define <some_unique_name>
<header_body>
#endif
#include guard
위키(커넥터 가드, 헤더 가드, 파일 가드) - 멀티패킷에 의한 헤더 포함preprocessor
수 .
#include
★★★★★★★★★★★★★★★★★」#import
는 일종의 즉, 으로 "복사/복사" - "복사" 메커니즘을 사용합니다..h
본문를 제외한 것)#include
,#import
이치노에는 ,, 과, 결, 결, 결, 결, 결, 결, it, it, it, it, it, it, it, it, it, it, it, it, it, it, it will,#include
,#import
하실 수 있습니다..m
제품 >실행 -> 전처리 -> ".m" 전처리
#예:
//A.h
@interface A : NSObject
- (int)startA;
@end
//ViewController.h
#include "A.h"
전처리 후 ViewController.m
@interface A : NSObject
- (int)startA;
@end
@interface ViewController : UIViewController
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
}
@end
이중포함 예
//A.h
@interface A : NSObject //Build time error: Duplicate interface definition for class 'A'
@end
//B.h
#include "A.h"
//C.h
#include "A.h"
//#import "A.h" to solve
#include "B.h"
recursive는 예를 포함한다.
//A.h
#include "B.h" //Build time error: #include nested too deeply
//#import "B.h" to fix it
@interface B : NSObject //Build time error: Duplicate interface definition for class 'A'
@end
//B.h
#include "A.h" //Build time error: #include nested too deeply
//#import "A.h" to fix it
@interface B : NSObject //Build time error: Duplicate interface definition for class 'B'
@end
인 [# Import ★★].h
★★★★★★★★★★★★★★★★★」.m
언급URL : https://stackoverflow.com/questions/439662/what-is-the-difference-between-import-and-include-in-objective-c
'programing' 카테고리의 다른 글
복잡한 Excel 공식에 주석을 추가하는 방법 (0) | 2023.04.15 |
---|---|
strings.xml 파라미터가 가능한가요? (0) | 2023.04.15 |
Python의 목록에 해당하는 사전 키 값 반복 (0) | 2023.04.15 |
명령줄에서 VBScript를 사용하여 Outside Excel에서 Excel 매크로 실행 (0) | 2023.04.15 |
테이블에서 필터 지우기 (0) | 2023.04.15 |