programing

목표 C에 #import와 #include의 차이점은 무엇입니까?

newsource 2023. 4. 15. 08:56

목표 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하면 무시됩니다.따라서 헤더 가드를 사용할 필요가 없습니다.

은 그냥 입니다.#importObjective-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_MODULESXcode- 컴파일 시.전술한 바와 같이..이 전략은 모든 것을 배제합니다.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