Objective-C 전 처리기
그만큼 Objective-C Preprocessor컴파일러의 일부는 아니지만 컴파일 프로세스에서 별도의 단계입니다. 간단히 말해서 Objective-C 전처리 기는 텍스트 대체 도구 일 뿐이며 실제 컴파일 전에 필요한 전처리를 수행하도록 컴파일러에 지시합니다. Objective-C 전처리기를 OCPP라고합니다.
모든 전 처리기 명령은 파운드 기호 (#)로 시작합니다. 공백이 아닌 첫 번째 문자 여야하며 가독성을 위해 전 처리기 지시문은 첫 번째 열에서 시작해야합니다. 다음 섹션은 모든 중요한 전 처리기 지시문을 나열합니다.
Sr. 아니. | 지침 및 설명 |
---|---|
1 | #define 전 처리기 매크로를 대체합니다. |
2 | #include 다른 파일에서 특정 헤더를 삽입합니다. |
삼 | #undef 전 처리기 매크로 정의 해제 |
4 | #ifdef 이 매크로가 정의 된 경우 true를 반환합니다. |
5 | #ifndef 이 매크로가 정의되지 않은 경우 true를 반환합니다. |
6 | #if 컴파일 시간 조건이 참인지 테스트 |
7 | #else #if의 대안 |
8 | #elif #else an #if in one statement |
9 | #endif 전 처리기 조건부 종료 |
10 | #error stderr에 오류 메시지를 인쇄합니다. |
11 | #pragma 표준화 된 방법을 사용하여 컴파일러에 특수 명령을 실행합니다. |
전 처리기 예
다음 예제를 분석하여 다양한 지시문을 이해하십시오.
#define MAX_ARRAY_LENGTH 20
이 지시문은 OCPP에 MAX_ARRAY_LENGTH 인스턴스를 20으로 대체하도록 지시합니다 . 가독성을 높이려면 상수에 #define 을 사용하십시오 .
#import <Foundation/Foundation.h>
#include "myheader.h"
이 지시문은 OCPP에 Foundation.h를 Foundation Framework현재 소스 파일에 텍스트를 추가합니다. 다음 줄은 OCPP에게myheader.h 로컬 디렉토리에서 컨텐츠를 현재 소스 파일에 추가하십시오.
#undef FILE_SIZE
#define FILE_SIZE 42
이것은 OCPP에게 기존 FILE_SIZE를 정의 해제하고 42로 정의하도록 지시합니다.
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif
이것은 MESSAGE가 아직 정의되지 않은 경우에만 MESSAGE를 정의하도록 OCPP에 지시합니다.
#ifdef DEBUG
/* Your debugging statements here */
#endif
이것은 DEBUG가 정의 된 경우 동봉 된 명령문을 처리하도록 OCPP에 지시합니다. 컴파일 할 때 -DDEBUG 플래그를 gcc 컴파일러에 전달하면 유용합니다 . 이것은 DEBUG를 정의하므로 컴파일하는 동안 즉시 디버깅을 켜고 끌 수 있습니다.
미리 정의 된 매크로
ANSI C는 많은 매크로를 정의합니다. 프로그래밍에서 각각 사용할 수 있지만 사전 정의 된 매크로를 직접 수정해서는 안됩니다.
Sr. 아니. | 매크로 및 설명 |
---|---|
1 | __DATE__ "MMM DD YYYY"형식의 문자 리터럴로 표시되는 현재 날짜 |
2 | __TIME__ "HH : MM : SS"형식의 문자 리터럴로 표시되는 현재 시간 |
삼 | __FILE__ 현재 파일 이름을 문자열 리터럴로 포함합니다. |
4 | __LINE__ 여기에는 10 진수 상수로 현재 줄 번호가 포함됩니다. |
5 | __STDC__ 컴파일러가 ANSI 표준을 준수하는 경우 1로 정의됩니다. |
다음 예를 들어 보겠습니다.
#import <Foundation/Foundation.h>
int main() {
NSLog(@"File :%s\n", __FILE__ );
NSLog(@"Date :%s\n", __DATE__ );
NSLog(@"Time :%s\n", __TIME__ );
NSLog(@"Line :%d\n", __LINE__ );
NSLog(@"ANSI :%d\n", __STDC__ );
return 0;
}
파일의 위 코드가 main.m 컴파일되고 실행되면 다음 결과가 생성됩니다.
2013-09-14 04:46:14.859 demo[20683] File :main.m
2013-09-14 04:46:14.859 demo[20683] Date :Sep 14 2013
2013-09-14 04:46:14.859 demo[20683] Time :04:46:14
2013-09-14 04:46:14.859 demo[20683] Line :8
2013-09-14 04:46:14.859 demo[20683] ANSI :1
전 처리기 연산자
Objective-C 전처리 기는 매크로 생성에 도움이되는 다음 연산자를 제공합니다.
매크로 연속 (\)
일반적으로 매크로는 한 줄에 포함되어야합니다. 매크로 연속 연산자는 한 줄에 비해 너무 긴 매크로를 계속하는 데 사용됩니다. 예를 들면-
#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")
스트링 화 (#)
문자열 화 또는 숫자 기호 연산자 ( '#')는 매크로 정의 내에서 사용될 때 매크로 매개 변수를 문자열 상수로 변환합니다. 이 연산자는 지정된 인수 또는 매개 변수 목록이있는 매크로에서만 사용할 수 있습니다. 예를 들면-
#import <Foundation/Foundation.h>
#define message_for(a, b) \
NSLog(@#a " and " #b ": We love you!\n")
int main(void) {
message_for(Carole, Debra);
return 0;
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
2013-09-14 05:46:14.859 demo[20683] Carole and Debra: We love you!
토큰 붙여 넣기 (##)
매크로 정의 내의 토큰 붙여 넣기 연산자 (##)는 두 인수를 결합합니다. 매크로 정의에서 두 개의 개별 토큰을 단일 토큰으로 결합 할 수 있습니다. 예를 들면-
#import <Foundation/Foundation.h>
#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)
int main(void) {
int token34 = 40;
tokenpaster(34);
return 0;
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
2013-09-14 05:48:14.859 demo[20683] token34 = 40
이 예제는 전 처리기에서 다음과 같은 실제 출력을 생성하기 때문에 어떻게 발생했는지-
NSLog (@"token34 = %d", token34);
이 예제는 token ## n을 token34로 연결하는 것을 보여 주며 여기서는 두 가지를 모두 사용했습니다. stringize 과 token-pasting.
defined () 연산자
전 처리기 defined연산자는 #define을 사용하여 식별자가 정의되었는지 확인하기 위해 상수 표현식에서 사용됩니다. 지정된 식별자가 정의 된 경우 값은 true (0이 아님)입니다. 기호가 정의되지 않은 경우 값은 false (영)입니다. 정의 된 연산자는 다음과 같이 지정됩니다.
#import <Foundation/Foundation.h>
#if !defined (MESSAGE)
#define MESSAGE "You wish!"
#endif
int main(void) {
NSLog(@"Here is the message: %s\n", MESSAGE);
return 0;
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
2013-09-14 05:48:19.859 demo[20683] Here is the message: You wish!
매개 변수화 된 매크로
OCPP의 강력한 기능 중 하나는 매개 변수화 된 매크로를 사용하여 기능을 시뮬레이션하는 기능입니다. 예를 들어, 다음과 같이 숫자를 제곱하는 코드가있을 수 있습니다.
int square(int x) {
return x * x;
}
다음과 같이 매크로를 사용하여 위의 코드를 다시 작성할 수 있습니다.
#define square(x) ((x) * (x))
인수가있는 매크로는 다음을 사용하여 정의해야합니다. #define지시문을 사용하기 전에. 인수 목록은 괄호로 묶여 있으며 매크로 이름 바로 뒤에 와야합니다. 매크로 이름과 여는 괄호 사이에는 공백이 허용되지 않습니다. 예를 들면-
#import <Foundation/Foundation.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void) {
NSLog(@"Max between 20 and 10 is %d\n", MAX(10, 20));
return 0;
}
위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.
2013-09-14 05:52:15.859 demo[20683] Max between 20 and 10 is 20