while (1): study();
[C언어] 전처리 지시자 본문
소스 코드를 컴파일하기까지의 과정은 크게 3단계로 나뉩니다.
- 전처리: 소스코드를 컴파일하기 좋은 형태로 적절히 수정
- 컴파일: 전처리된 소스코드를 기계가 읽을 수 있는 객체 파일(object file)로 변환
- 링크: 객체 파일을 운영체제가 읽을 수 있도록 startup code를 붙여 실행 파일로 변환
이 중 가장 첫 단계인 전처리 단계에서 쓰이는 지시자들을 알아봅니다.
1. #include
가장 흔하게 접할 수 있는 전처리 지시자인 #include는 텍스트 형태의 파일을 현재 소스코드에 붙여넣는 기능을 수행합니다.
#include <stdio.h>
#include "my_header.h"
#include "my_module.c"
불러올 텍스트 파일은 <> 또는 " "를 사용하여 불러옵니다. <>를 사용하는 경우 컴파일러의 include 디렉토리에 정의된 표준 헤더 파일을 불러오게 되며, " "를 사용하면 지정된 경로(혹은 경로 미지정 시 현재 디렉토리)의 파일을 불러옵니다. 위의 예에서 알 수 있다시피 헤더파일 외에도 다른 소스파일을 불러올 수도 있습니다.
2. #define
#define을 이용하면 매크로를 정의할 수 있습니다.
#define MY_MACRO "HI"
#define MY_MACRO_ADD(a, b) ((a) + (b))
자주 쓰이거나 복잡한 상수를 매크로 상수에 할당하여 편하게 활용할 수 있으며, 위와 같이 함수를 정의하는 일도 가능합니다. #define으로 정의된 매크로 함수의 경우 일반 함수보다 빠르게 불러올 수 있다는 장점이 있으나, 유지보수가 어렵고 예외를 발생시키기 쉽다는 단점이 있습니다.
또한 다음과 같이 매크로 연산자를 사용하여 더욱 편리한 매크로를 정의할 수도 있습니다.
#include <stdio.h>
#define PRINT_EXPR(x) printf(#x " = %d\n", x)
#define NAME_CAT(x, y) (x ## y)
int main(void)
{
int a1, a2;
NAME_CAT(a, 1) = 10;
NAME_CAT(a, 2) = 20;
PRINT_EXPR(a1 + a2);
PRINT_EXPR(a2 - a1);
return 0;
}
매크로를 정의할 때 인수에 #을 사용할 경우 자동으로 문자열 형식으로 치환합니다. 또한 ##는 두 인수를 붙여서 치환하는 연산자입니다.
정의된 매크로에 따라서 조건을 분기하여 컴파일할 코드를 결정하고 싶은 경우, 조건부 컴파일 지시자를 사용할 수 있습니다.
#include <stdio.h>
#define VER 7
#define BIT16
int main(void)
{
int max;
#if VER >= 6
printf("버전 %d입니다.\n", VER);
#endif
#ifdef BIT16
max = 32767;
#else
max = 2147483647;
#endif
printf("int형 변수의 최댓값 : %d\n", max);
return 0;
}
기본적인 if문과 형식은 비슷하나, 쉘 스크립트처럼 마지막에 endif로 if문의 끝을 지정해줘야 한다는 것이 다릅니다. #ifdef은 #if defined와 같은 역할을 수행하며 해당 매크로가 정의되어 있을때만 컴파일시키는 기능을 합니다. 반대로 #ifndef은 #if !defined와 같은 기능이며, 해당 매크로가 정의되어 있지 않을때만 수행합니다.
3. #pragma
#pragma는 컴파일러의 동작을 제어하는 역할을 합니다. 주로 사용되는 것은 pack, warning이 있습니다.
#pragma pack(push, 1) // 바이트 얼라인먼트 기존 단위 크기 기억, 단위 크기 1로 변경
#pragma pack(pop) // 기존 단위 크기로 변경 (push로 기억 필요)
#pragma pack(1) // 단위 크기 1로 변경
#pragma warning(disable:4101) // 4101번 에러 무시
'학습 > C, C++' 카테고리의 다른 글
[C++]함수 오버로딩 (0) | 2021.12.17 |
---|---|
사칙연산 계산기 (0) | 2021.12.16 |
단어 검출 프로그램 (0) | 2021.12.16 |
성적 처리 프로그램 (0) | 2021.12.14 |
소수 계산 프로그램 (0) | 2021.12.13 |