산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C 전처리기(CPP) 이해: 컴파일 과정을 단순화하는 방법

C 전처리기는 컴파일러의 일부가 아니지만, 컴파일 과정에서 별도의 단계로 수행됩니다. 간단히 말해, C 전처리기는 텍스트 치환 도구이며 실제 컴파일 전에 필요한 전처리 작업을 컴파일러에 지시합니다. 앞으로 C 전처리기를 CPP라고 부르겠습니다.

모든 전처리기 명령은 해시 기호(#)로 시작합니다. 이는 첫 번째 공백이 아닌 문자여야 하며, 가독성을 위해 전처리 지시문은 첫 번째 열에서 시작하는 것이 좋습니다. 다음 섹션에서는 중요한 전처리 지시문들을 나열합니다.

번호 지시문 및 설명
1

#define

전처리기 매크로를 치환합니다.

2

#include

다른 파일에서 특정 헤더를 삽입합니다.

3

#undef

전처리기 매크로 정의를 해제합니다.

4

#ifdef

이 매크로가 정의되어 있으면 참을 반환합니다.

5

#ifndef

이 매크로가 정의되어 있지 않으면 참을 반환합니다.

6

#if

컴파일 타임 조건이 참인지 테스트합니다.

7

#else

#if에 대한 대안입니다.

8

#elif

#else와 #if를 한 문장으로 결합합니다.

9

#endif

전처리기 조건문을 종료합니다.

10

#error

stderr에 에러 메시지를 출력합니다.

11

#pragma

표준화된 방법을 사용하여 컴파일러에 특수 명령을 내립니다.

전처리기 예제

다음 예제들을 분석하여 다양한 지시문을 이해해 보세요.

#define MAX_ARRAY_LENGTH 20

이 지시문은 CPP에게 MAX_ARRAY_LENGTH를 20으로 치환하라고 지시합니다. 가독성을 높이기 위해 상수에 #define을 사용하세요.

#include <stdio.h>
#include "myheader.h"

이 지시문들은 CPP에게 시스템 라이브러리에서 stdio.h를 가져와 현재 소스 파일에 텍스트를 추가하도록 지시합니다. 다음 줄은 CPP에게 로컬 디렉터리에서 myheader.h를 가져와 현재 소스 파일에 내용을 추가하도록 지시합니다.

#undef FILE_SIZE
#define FILE_SIZE 42

기존 FILE_SIZE를 정의 해제하고 42로 정의하도록 CPP에 지시합니다.

#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif

MESSAGE가 아직 정의되지 않은 경우에만 MESSAGE를 정의하도록 CPP에 지시합니다.

#ifdef DEBUG
/* 디버깅 문장들 */
#endif

DEBUG가 정의된 경우에만 포함된 문장들을 처리하도록 CPP에 지시합니다. 컴파일 시 gcc 컴파일러에 -DDEBUG 플래그를 전달하면 유용합니다. 이렇게 하면 DEBUG가 정의되어 컴파일 중에 디버깅을 켜고 끌 수 있습니다.

사전 정의된 매크로

ANSI C는 여러 매크로를 정의합니다. 각 매크로는 프로그래밍에 사용할 수 있지만, 사전 정의된 매크로는 직접 수정하지 않아야 합니다.

번호 매크로 및 설명
1

__DATE__

"MMM DD YYYY" 형식의 현재 날짜를 문자 리터럴로 제공합니다.

2

__TIME__

"HH:MM:SS" 형식의 현재 시간을 문자 리터럴로 제공합니다.

3

__FILE__

현재 파일명을 문자열 리터럴로 포함합니다.

4

__LINE__

현재 줄 번호를 십진 상수로 포함합니다.

5

__STDC__

컴파일러가 ANSI 표준을 준수할 때 1로 정의됩니다.

다음 예제를 실행해 보세요.

Live Demo
#include <stdio.h>
int main() {
    printf("File :%s\n", __FILE__ );
    printf("Date :%s\n", __DATE__ );
    printf("Time :%s\n", __TIME__ );
    printf("Line :%d\n", __LINE__ );
    printf("ANSI :%d\n", __STDC__ );
}

위 코드를 test.c 파일에 저장하고 컴파일하여 실행하면 다음과 같은 결과가 나옵니다.

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

전처리기 연산자

C 전처리기는 매크로 생성을 돕기 위해 다음 연산자들을 제공합니다.

매크로 연속(\) 연산자

매크로는 일반적으로 한 줄로 제한됩니다. 매크로 연속 연산자(\)는 한 줄에 담기엔 너무 긴 매크로를 계속 이어서 작성할 때 사용합니다. 예를 들어:

#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")

문자열화(#) 연산자

매크로 정의 내에서 문자열화 또는 숫자 기호 연산자('#')는 매크로 매개변수를 문자열 상수로 변환합니다. 이 연산자는 지정된 인수 또는 매개변수 목록을 가진 매크로에서만 사용할 수 있습니다. 예를 들어:

Live Demo
#include <stdio.h>
#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")
int main(void) {
    message_for(Carole, Debra);
    return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.

Carole and Debra: We love you!

토큰 병합(##) 연산자

매크로 정의 내의 토큰 병합 연산자(##)는 두 인수를 결합합니다. 매크로 정의에서 두 개의 개별 토큰을 단일 토큰으로 결합할 수 있게 합니다. 예를 들어:

Live Demo
#include <stdio.h>
#define tokenpaster(n) printf("token" #n " = %d", token##n)
int main(void) {
    int token34 = 40;
    tokenpaster(34);
    return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.

token34 = 40

이 예제는 전처리기에서 다음과 같은 실제 출력이 나오기 때문에 발생합니다.

printf("token34 = %d", token34);

이 예제는 token##n이 token34로 결합되는 것을 보여주며, 여기서 문자열화와 토큰 병합을 모두 사용했습니다.

defined() 연산자

전처리기 defined 연산자는 상수 표현식에서 식별자가 #define을 사용하여 정의되었는지 확인하는 데 사용됩니다. 지정된 식별자가 정의되어 있으면 값은 참(0이 아닌 값)입니다. 심볼이 정의되지 않으면 값은 거짓(0)입니다. defined 연산자는 다음과 같이 지정됩니다.

Live Demo
#include <stdio.h>
#if !defined(MESSAGE)
#define MESSAGE "You wish!"
#endif
int main(void) {
    printf("Here is the message: %s\n", MESSAGE);
    return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.

Here is the message: You wish!

매개변수가 있는 매크로

CPP의 강력한 기능 중 하나는 매개변수가 있는 매크로를 사용하여 함수를 시뮬레이션하는 능력입니다. 예를 들어, 숫자의 제곱을 계산하는 코드가 다음과 같다고 해보겠습니다.

int square(int x) {
    return x * x;
}

위 코드를 매크로를 사용하여 다음과 같이 다시 작성할 수 있습니다.

#define square(x) ((x) * (x))

인수가 있는 매크로는 사용하기 전에 #define 지시문으로 정의해야 합니다. 인수 목록은 괄호로 묶으며 매크로 이름 바로 뒤에 와야 합니다. 매크로 이름과 여는 괄호 사이에는 공백이 없어야 합니다. 예를 들어:

Live Demo
#include <stdio.h>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void) {
    printf("Max between 20 and 10 is %d\n", MAX(10, 20));
    return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.

Max between 20 and 10 is 20

C 언어

  1. C# Hello World – 첫 C# 애플리케이션 만들기
  2. C# 키워드와 식별자 이해: 규칙, 목록, 모범 사례
  3. C# 변수와 기본 데이터 타입 완벽 가이드
  4. C# 연산자 – C# 연산자 종합 가이드
  5. C# 비트 연산자와 시프트 연산자 완전 정복: 종합 가이드
  6. C# 기초: 입출력(Essential Input/Output) 완벽 가이드
  7. C# 식, 문, 블록: 개념과 실전 예제로 완벽 이해
  8. C# 주석 마스터하기: 종류, 모범 사례, XML 문서화
  9. C# switch 문 마스터하기: 문법, 예제, 모범 사례
  10. C# 삼항 연산자: 조건부 표현식을 간결하게 작성하는 법