happy coding

[c] 선행처리기 본문

self study/언어의 기본부터

[c] 선행처리기

yeoonii 2022. 11. 27. 21:12

선행처리기(preprocess)

선행처리실행 파일을 생성하는 과정에서 소스 파일 내에 존재하는 선행처리 지시문을 처리하는 작업을 의미한다. 이러한 작업은 컴파일하기 전 선행처리기에 의해 먼저 처리된다. 선행처리기는 코드를 생성하는 것이 아니라, 컴파일러가 컴파일하기 좋도록 소스를 재구성하는 역할을 한다.

선행처리문 특징

1. 선행처리문은 선행처리 문자(#)로 시작한다.

2. 선행처리문은 코드 내에서 하나의 라인을 모두 차지하며, 선행처리문 뒤에 C언어 코드를 추가하여 같이 사용할 수 없다.

3. 선행처리문은 다른 C언어의 명령문과는 달리 맨 뒤에 세미콜론(;)을 붙이지 않다.

4. 선행처리문은 소스 파일 어디에나 위치할 수 있지만, 선행처리문이 위치한 곳에서부터 파일의 끝까지만 영향을 미친다.

선행처리 지시자(preprocessing directives)

#include 외부에 선언된 함수나 상수 등을 사용하기 위해, 함수나 상수가 포함된 외부 파일을 현재 파일에 포함할 때 사용함.
#define 함수나 상수를 단순화해주는 매크로를 정의할 때 사용함.
#undef #define 지시자로 이미 정의된 매크로를 삭제할 때 사용함.
#line __LINE__ 매크로와 __FILE__ 매크로를 재정의할 때 사용함.
#error 지정한 오류 메시지를 출력하고, 컴파일 과정을 중단하고자 할 때 사용함.
#pragma 프로그램의 이식성을 위해 운영체제별로 달라지는 지시사항을 컴파일러에 전달할 때 사용함.
#if, #ifdef, #ifndef,
#elif, #else, #endif
조건부 컴파일 지시자

#include

#include 선행처리 지시자는 외부에 선언된 함수나 상수 등을 사용하기 위해 헤더 파일을 현재 파일에 포함할 때 사용한다. 선행처리기는  #include 지시자 뒤에 나오는 파일 이름을 보고 해당 파일을 찾아 그 내용을 현재 파일에 포함해 준다.

#include 선행처리 지시문에서 파일 이름을 표시하는 방법에는 1. #include <stdio.h> 2. #include "myStdio.h" 이 있다.

C언어에서 제공하는 표준 헤더 파일을 포함할 때에는 꺾쇠괄호를 사용한다. 이렇게 파일 이름을 표시하면, 선행처리기는 가장 먼저 표준 시스템 디렉터리에서 파일 이름에 해당하는 헤더 파일을 찾는다. 하지만 표준 시스템 디렉터리에서 파일 이름에 해당하는 헤더 파일을 찾지 못하면, 현재 작업 디렉터리도 검색한다.

사용자가 직접 작성한 헤더 파일을 포함할 때에는 보통 큰따옴표를 사용한다. 이렇게 파일 이름을 표시하면, 선행처리기는 가장 먼저 현재 작업 디렉터리에서 파일 이름에 해당하는 헤더 파일을 찾는다. 하지만 파일 이름에 해당하는 헤더 파일을 찾지 못하면, 표준 시스템 디렉터리도 검색한다. 

#define

#define 선행처리 지시자는 함수나 상수를 단순화해주는 매크로를 정의할 때 사용한다. 매크로는 함수나 상수에 이름을 붙임으로써, 해당 매크로가 무엇을 가리키고 있는지를 명확하게 나타내준다. 따라서 코드의 가독성을 증가시키고, 코드를 훨씬 더 읽기 편하게 해준다.

#define 식별자 대체리스트

선행처리기가 #define 선행처리 지시문의 식별자를 단순히 대체 리스트로 치환해주는 과정을 매크로 확장(macro expansion)이라고 한다.

#define 선행처리 지시문에서 식별자는 매크로(macro)라고 부르는 사용자가 미리 정의한 약어이다. 이때 매크로 이름인 식별자는 C언어의 변수 이름 생성 규칙과 똑같은 생성 규칙을 따라서 작성해야 한다. 따라서 매크로 이름 중간에는 공백을 넣을 수 있지만, 실제값은 공백을 가질 수 있다. 그리고 매크로끼리 중첩하여 사용할 수도 있다. 단, 문자열에 포함된 매크로 이름에 대한 치환 작업은 이루어지지 않는다.

값을 나타내는 매크로를 객체 같은 매크로(object-like macro) 라고 한다.

 

'self study > 언어의 기본부터' 카테고리의 다른 글

[c] 미리 정의된 매크로(predefined macro)  (0) 2022.11.27
[c] 매크로 함수  (0) 2022.11.27
[c] 파일 입출력 함수  (0) 2022.11.27
[c] 파일 입출력  (0) 2022.11.27
[c] 콘솔 입출력  (0) 2022.11.27
Comments