문타쿠, 공부하다.
[독하게 시작하는 C 프로그래밍] 섹션 20. 전처리기 본문
#include
- 컴파일 전에 선행처리를 위한 문법
- 헤더 포함
- 조건부 컴파일
- 심복릭 상수 정의
- 매크로 정의
- '#' 기호로 시작
- 헤더 파일(선언 코드가 들어 있는 파일)을 소스코드에 합쳐주는 기능 -> .c파일과 .h파일을 합침
- <>로 포함 시 컴파일러가 정의하고 있는 시스템 헤더 파일들 중 검색
- " "로 포함 시 현재 경로에서 파일 검색
#pragma once -> '헤더가 중복 인클루드 했을 때 한 번만 인클루드 해라'라는 의미
#define과 매크로 정의
#define
- 형 한정에 const처럼 심볼릭 상수를 정의할 수 있는 전처리기
- 정의한 상수는 컴파일 전에 적용되어 소스코드를 치환
매크로
- #define 전처리기로 정의
- 함수처럼 보이지만 함수가 아님
- 함수 호출에 의한 오버헤드가 없음
- 컴파일러 최적화에 따라 사용빈도가 현저히 줄어듦 -> 세상이 발전함에 따라 컴파일러가 너무 좋아져서 알아서 최적화를 다 해주다보니 매크로를 사용할 일이 거의 없다고 볼 수 있음
#include <stdio.h>
#define ADD(num1, num2) (num1 + num2)
int Subtract(int num1, int num2)
{
return num1 - num2;
}
int main(void)
{
printf("%d\n", ADD(10, 20));
printf("%d\n", Subtract(10, 20));
return 0;
}
매크로 특수화 연산자
#include <stdio.h>
// 1. # 기호가 한 개 붙은 경우
// 넘겨받은 값을 문자열로 만듦
#define STRING(s) #s
// 2. # 기호가 두 개 붙은 경우
// 넘겨받은 두 개의 값을 합쳐 하나의 소스코드 문자(열)로 만듦
#define PASTER(a, b) a##b
int main(void)
{
int number = 100;
printf("%s\n", STRING(num));
printf("%s\n\n", STRING(number));
/* nu와 mber이 합쳐져서 number이 되고,
* 이 number은 위에 100이라는 값을 가진 int형 변수 number를 의미한다.
* 결론적으로 printf("%d\n", number);과 같은 의미 */
printf("%d\n", PASTER(nu, mber));
return 0;
}
인터프리터를 베이스로 성능이 좋고 범용성을 갖는 언어나 자바 같은 하이브리드 언어가 나오기 전에는 매크로가 상당한 위력을 가지고 있었다.
하지만 요즘에 와서는 컴파일러의 성능이 발전함에 따리 최적화를 알아서 해주다 보니 매크로를 사용하는 경우가 거의 없다고 볼 수 있다.
레거시 코드라고 불리는 오래된 구형 코드들에는 아직 매크로의 흔적이 남아있으니 매크로에 대해서 어느 정도 이해는 하고 있자.
조건부 컴파일
- 상수 정의 여부에 따라 실제 컴파일 되는 코드가 달라지도록 구성하는 것이 목적
- #ifdef, #else, #endif로 구성
- Debug/release 빌드 선택
- 문자열(MBCS, Unicode) 선택
상수가 정의된 경우
#include <stdio.h>
// 상수가 정의된 경우
#define WATER
#ifdef WATER
#define MESSAGE "I have water."
#else
#define MESSAGE "I dont't have water."
#endif
int main(void)
{
puts(MESSAGE);
return 0;
}
상수가 정의되지 않은 경우
#include <stdio.h>
// 상수가 정의되지 않은 경우
// #define WATER
#ifdef WATER
#define MESSAGE "I have water."
#else
#define MESSAGE "I dont't have water."
#endif
int main(void)
{
puts(MESSAGE);
return 0;
}
'C언어 > 독하게 시작하는 C 프로그래밍' 카테고리의 다른 글
[독하게 시작하는 C 프로그래밍] 섹션 21. 함수에 대한 고급 이론 (0) | 2023.12.03 |
---|---|
[독하게 시작하는 C 프로그래밍] 섹션 19. 변수와 상수 고급 이론 (Part 4. 고급 이론) (0) | 2023.12.01 |
[독하게 시작하는 C 프로그래밍] 섹션 18. 파일 입/출력 (0) | 2023.11.30 |
[독하게 시작하는 C 프로그래밍] 섹션 17. 구조체와 공용체 (0) | 2023.11.26 |
[독하게 시작하는 C 프로그래밍] 섹션 16. 함수 응용 (0) | 2023.11.26 |