Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
iOS Developer/Objective-C

14. Objective-C Preprocessor 전처리기

by Toughie 2024. 5. 16.

KAKAO-Choonsik
https://www.geeksforgeeks.org/cc-preprocessors/

 

Objective-C의 Preprocessor(전처리기)는 텍스트 대치 도구이고,

컴파일러가 실제 컴파일 이전에 요구되는 전처리를 할 수 있도록 한다.(텍스트 삽입, 대치 등)

 

모든 전처리 명령은 #으로 시작한다. 공백이 아닌 글자로 시작하고 주로 한 줄에 다 작성한다.

 

매크로란? 코드에서 자주 사용되는 일정한 패턴이나 값을 하나의 이름으로 정의해 반복적인 코딩 작업을 줄여주는 기능


#define

매크로 상수 정의

MAX_LENGTH를 20으로 대치할 것을 명령한다

#define MAX_LENGTH 20

 

#import

전처리기에게 Foundation 프레임워크로부터 foundation.h를 가져오라고 명령한 후

현재 소스 파일에 텍스트를 추가하게 한다.

#import <Foundation/Foundation.h>

 

#include

로컬 디렉토리에서 헤더파일을 불러와 현재 소스에 추가할 것을 명령

#include "myHeader.h"

 

#undef

현재 매크로를 해제하고, 재정의

#undef FILE_SIZE
#define FILE_SIZE 42

 

#ifndef

매크로가 이미 정의되어 있지 않은 경우에만 정의

#ifndef MYMESSAGE
    #define MYMESSAGE "RAINS"
#endif

 

#ifdef

매크로가 정의되어 있다면 수행할 것 (디버깅 모드에서만 수행할 것 작성)

void debugLog(NSString *logMessage) {
#ifdef DEBUG
    /* debugging */
    NSLog(@"It's debugging mode!");
#endif
}

 

predefined Macros

사전정의 매크로

ANSI (American National Standars Institue) 표준 C에서는 미리 정의된 매크로가 제공된다.

 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__); //ANSI 표준으로 컴파일 하면 1

 

Preprocessor Operators

전처리 연산자(#)

매크로 정의에서 #은 파라미터를 문자열 상수로 바꿔준다.

#define message_for(a,b) \
NSLog(@#a " and " #b ": WE LIKE APPLE!\n")

 

Token Pasting(##)

#define tokenpaster(N) NSLog (@"token" #N " = %d", token##N)
//NSLog(@"tokenN = %d",tokenN);으로 처리된다.

 

defined

defined연산자는 상수 표현식에서 식별자가 정의되어 있는 경우 1, 아니면 0이 된다.

#if !defined(MYMESSAGE)
    #define MYMESSAGE  = "NEW MESSAGE"
#endif

 

Parameterized Macros

인자를 받아들이는 매크로로 함수처럼 동작한다. 컴파일 시점에 인자를 전달받아 텍스트 치환이 된다.

의도치 않은 동작을 방지하기 위해 파라미터를 소괄호로 감싸주자.

#define square(x) ((x) * (x))
#define MAX(a,b) ((a) > (b) ? (a) : (b))