while (1): study();

[C언어] 전처리 지시자 본문

학습/C, C++

[C언어] 전처리 지시자

전국민실업화 2021. 12. 16. 17:30
728x90

소스 코드를 컴파일하기까지의 과정은 크게 3단계로 나뉩니다.

  1. 전처리: 소스코드를 컴파일하기 좋은 형태로 적절히 수정
  2. 컴파일: 전처리된 소스코드를 기계가 읽을 수 있는 객체 파일(object file)로 변환
  3. 링크: 객체 파일을 운영체제가 읽을 수 있도록 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번 에러 무시
728x90

'학습 > C, C++' 카테고리의 다른 글

[C++]함수 오버로딩  (0) 2021.12.17
사칙연산 계산기  (0) 2021.12.16
단어 검출 프로그램  (0) 2021.12.16
성적 처리 프로그램  (0) 2021.12.14
소수 계산 프로그램  (0) 2021.12.13
Comments