본문 바로가기
Program/C

13. C언어 전처리기와 매크로

by Murciellago 2021. 11. 17.
반응형
SMALL

이 장에서는 C언어 전처리기를 소개하고 예제를 통해 #include, #define 및 조건부 컴파일을 사용하는 방법을 설명하겠습니다.

 

전처리 작업방식

C언어에서 전처리는 프로그램이 컴파일되기 전에 변환하는 전처리기는 매크로로 정의 가능하다. 이러한 변환에는 헤더파일, 매크로 확장 등이 포함될 수 있다.

 

모든 전처리 지시문은 # 기호로 시작한다.

C언어에서 전처리기의 일반적인 용도는 다음 예와 같다.

 

예)

#include <stdio.h> 

 

#define PI 3.14 

 

 

1. 헤더파일 : #include

 

#include  프리 프로세서에서는  C언어 프로그램에 헤더 파일을 포함하는데 사용된다. 

 

위 예제와 동일하게 #include <stdio.h> 라는 헤더파일이 있다.

printf문과 scanf문을 사용하기 위해 stdio.h라는 정의한 헤더파일을 사용해야하는 이유이다.

 

함수 선언을 포함하는 고유한 헤더 파일을 만들고 이 전처리기 지시문을 사용하여 프로그램에 포함할 수도 있다.

 

예)

#include "header.h"

#include "serial.h"

 

헤더파일은  여러소스 파일 간에 공유할 C언어에서 선언 및 매크로 정의를 포함하는 파일이다.

다음과 같은 방법으로 프로그램의 헤더파일의 사용을 요청할 때 전처리기인 #include라는 지시어를 사용한다.

 

헤더파일은 두가지 용도로 사용한다.

 

1) 시스템 헤더파일은 운영체제의 일부에 대한 인터페이스를 선언하고, 시스템 호출과 라이브러리를 호출하는데 필요한 정의와 선언을 제공하기 위해 프로그램에 포함시킨다.

2) 자신의 헤더파일에는 프로그램의 소스파일 간의 인터페이스에 대한 선언이 포함되어 있다. 여러 다른 소스 파일에서 모두 또는 대부분이 필요한 관련 선언 및 매크로 정의 그룹이 있을 때마다 해당 선언에 대한 헤더파일을 만드는 것이 좋다

 

헤더파일을 포함하면 헤더파일을 필요로 하는 각 소스파일에 복사하는 것과 동일한 결과물이 생성된다. 소스파일에 복사하는 것은 코딩하는데 시간이 많이 걸리고 오류가 발생하기 쉽기에 헤더파일을 사용하면 관련되어있는 선언문을 한곳에만 나타내는 것이 좋다. 변경이 필요한 경우 한곳에서 변경할 수 있으며 헤더파일을 포함하는 프로그램은 다음에 다시 컴파일할 때 자동으로 새버전으로 사용한다. 헤더파일은 모든 사본을 찾고 변경하는 수고와 하나의 사본을 찾지 못하면 프로그램 내에서 불일치가 발생할 위험이 발생하기에 사본을 제거하고 코딩하는 것이 좋다.

 

C언어에서 일반적인 규칙은 다음으로 끝나는 헤더파일 이름을 지정하는 것이다. 

헤더파일 이름에 문자, 숫자, 대시(-) 및 밑줄(_)만 사용하고 최대 한개의 점만 사용하는 것이 가장 이식성이 좋다.

 

헤더파일에 대한 궁금사항은 아래 주소로 확인 바람

https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html#Header-Files

 

Header Files (The C Preprocessor)

2 Header Files A header file is a file containing C declarations and macro definitions (see Macros) to be shared between several source files. You request the use of a header file in your program by including it, with the C preprocessing directive ‘#incl

gcc.gnu.org

 

 

2. 매크로 : #define

 

매크로는 이름이 지정된 코드 조각이다. #define 전처리기 지시문을 사용하여 C언어에서 매크로를 정의할 수 있다.

 

예)

#define pi 3.14

 

pi라는 함수는 3.14라는 숫자로 대체된다.

 

예1) #define 전처리기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#define pi 3.14
 
int main()
{
    float rad, area;
    printf("Enter the radius: ");
    scanf("%f"&rad);
 
  
    area = pi*rad*rad;
 
    printf("Area=%.2f",area);
    return 0;
}
 

 

3. 매크로와 같은 기능

 

함수 호출과 유사한 방식으로 작동하는 매크로를 정의할 수도 있다.

 

예)

#define area(r) (3.14*r*r)

 

이것이 함수형 매크로라고 한다.

프로그램을 할때  r값을 지정한다면 #define area(5) 3.14*5*5라는 식이 생성될 것이다.

 

예1) #define 전처리기 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#define pi 3.14
#define Area(r) (pi*r*r)
 
int main() {
    float rad, area;
 
    printf("Enter the radius: ");
    scanf("%f"&rad);
    area = Area(rad);
    printf("Area = %.2f", area);
 
    return 0;
}
 
 

 

매크로에 대한 궁금사항은 아래 주소로 확인 바람

https://gcc.gnu.org/onlinedocs/cpp/Macros.html#Macros

 

Macros (The C Preprocessor)

3 Macros A macro is a fragment of code which has been given a name. Whenever the name is used, it is replaced by the contents of the macro. There are two kinds of macros. They differ mostly in what they look like when they are used. Object-like macros rese

gcc.gnu.org

 

4. 조건부 컴파일

 

C언어 프로그래밍에서는 코드블록을 포함할지 여부를 전처리기에 지시할 수 있다. 이를 위해 조건부 지시문을 사용한다.

 

조건부 사용

- 기계, 운영체제에 따라 다른 코드 사용

- 두 개의 다른 프로그램에서 동일한 소스파일 컴파일

- 프로그램에서 특정 코드를 제외하지만 향후 목적을 위해 참조로 유지

 

조건문을 사용하는 방법

#ifdef, #if, #defined, #else, #elif 라는 지시어를 사용

 

#ifdef 지시문

 

예)

#ifdef macro

#endif

 

여기서 조건부 코드는 다음과 같은 경우에만 프로그램에 포함되어 매크로로 정의한다.

 

 

#if, #elif, #else

 

예)

#if expression

#endif

 

예)

#if expression

   codes if ex is zero

#else

   codes if ex is 0

#endif

 

예)

#if ex

#elif ex1

#elif ex2

#else

#endif

 

여기에서는 정수 유형의 표현식으로 정수, 문자, 산술 표현식, 매크로 등이 될 수 있다.

조건부 코드는 다음과 같은 경우에만 프로그램에 포함된다.

선택적으로 #else지시문은 #if 지시문과 함께 사용가능하다.

 

#defined

특수 연산자인 #defined 에서 특정 매크로가 정의되었는지 여부를 텍스트하는데 사용한다.

#if와 함께 자주 사용한다.

 

예)

 #if defined BUF&&BUF >= 2048

 

 

5. 미리 정의된 매크로

 

C언어 프로그래밍에서 미리 정의된 매크로이다.

 

매크로 내용
__DATE__   현재 날짜를 포함하는 문자열
__FILE__   파일 이름을 포함하는 문자열
__LINE__   현재 줄 번호를 나타내는 정수
__STDC__   ANSI 표준 C언어를 따르는 경우 값은 0이 아닌 정수
__TIME__   현재 날짜가 포함된 문자열

 

예)

__TIME__ 을 매크로를 사용하여 시간을 출력

 

1
2
3
4
5
#include <stdio.h>
int main()
{
   printf("Current time: %s",__TIME__);   
}
 
 

 

output)

Current time : 13:22:19

 

반응형
LIST

'Program > C' 카테고리의 다른 글

15. C언어 프로그래밍의 사용자 정의 함수 유형  (0) 2021.11.28
14. C언어 사용자 정의 함수  (0) 2021.11.28
12. C언어 goto 문  (0) 2021.10.20
11. C언어 switch 문  (0) 2021.10.20
10. C언어 break와 continue  (0) 2021.10.20

댓글