전처리
==> 전처리기가 소스 코드를 컴파일하기 좋게 다듬는 과정이며 소스 코드에서 #으로 시작하는 지시자를 처리한다
다양한 전처리 지시자
파일을 포함하는 #include
- #include는 지정한 파일의 내용을 읽어와 지시자가 있는 위치에 붙여놓은다
- 꺽쇠갈호(<>)는 컴파일러의 헤더파일을 포함할 때 사용한다
- 큰따음표(" ")는 사용자의 헤더파일을 포함할 때 사용한다
student.h (사용자가 만든 헤더파일)
typedef struct
{
int num;
char name[20];
} Student;
main.c (소스파일)
#include <stdio.h> // 컴파일러가 만든 헤더파일을 포함한다
#include "student.h" // 사용자가 만든 헤더파일을 포함한다
int main(void)
{
Student a = { 315, "홍길동" };
printf("학번 : %d, 이름 : %s\n", a.num, a.name);
return 0;
}
==> 꺽쇠갈호는 컴파일러가 제공하고, 큰따음표는 사용자가 만든 헤더 파일을 나타낸다
==> 보통 하나의 프로그램은 독립적으로 컴파일 가능한 파일 단위인 모듈로 나누아 분할 컴파일한다
( 위 그림은 분할 컴파일된 파일을 전처리하면 하나의 프로그램이 되는 과정을 보여준 것이다 )
매크로명을 만드는 #define
#define은 매크로명을 정의하는 전처리 지사자
#define 매크로명 치환될_부분 // 매크로명은 대문자를 사용한다
#include <stdio.h>
#define PI 3.14159 // PI처럼 상수 대신에 쓰이는 매크로명이 매크로 상수이다
#define LIMIT 100.0
#define MSG "passed!"
#define ERR_PRN printf("허용 범위를 벗어났습니다!")
int main(void)
{
double radius, area;
printf("반지름을 입력하세요(10이하) : ");
scanf("%lf", &radius);
area = PI * radius * radius;
if (area > LIMIT) ERR_PRN;
else printf("원의 면적 : %.2lf (%s)\n", area, MSG);
return 0;
}
매크로명은 자주 사용하는 복잡한 숫자나 문자열 등을 의미 있는 단어로 쉽게 표현할 수 있다
( 디버깅 및 유지보수가 힘들기 때문에 제한적으로 쓰는 것이 좋다 )
#define을 사용한 매크로 함수
매크로 함수
C언어에서는 #define 선행처리 지시문에 인수로 함수의 정의를 전달함으로써, 함수처럼 동작하는 매크로를 만들 수 있다.이러한 매크로를 함수 같은 매크로(function-like macro) 또는 매크로 함수라고 합니다.
매크로 함수는 인수에 따라 서로 다른 결과값을 갖도록 치환된다
#define 매크로_함수명(인수) 치환될_부분
매크로 함수를 사용한 프로그램
#include <stdio.h>
#define SUM(a,b) ((a) + (b)) // 매크로 함수 SUM을 정의
#define MUL(a,b) ((a) + (b)) // 매크로 함수 MUL을 정의
int main(void)
{
int a = 10, b = 20;
int x = 30, y = 40;
int res;
printf("a+b=%d\n", SUM(a, b));
printf("x+y=%d\n", SUM(x, y));
res = 30 / MUL(2, 5);
printf("res:%d\n", res);
return 0;
}
예시 1)
매크로 함수 정의
#define MUL(a, b) a * b
매크로 함수 사용
res = 30 / MUL(2, 5); //전처리 전
res = 30 / 2 * 5; //전처리 후
==> 결과값은 75
예시 2)
매크로 함수 정의
#define MUL(a, b) (a * b)
매크로 함수 사용
res = 30 / MUL(2, 5);
res = 30 / (2 * 5); //괄호와 함꼐 치환
==> 결과값은 10
예시 3)
매크로 함수 정의
#define MUL(a, b) (a * b)
매크로 함수 사용
res = 30 / MUL(2, 2 + 3);
res = 30 / (2 * 2 + 3); // 곱셈을 먼저 계산
==> 결과값은 4
'C 언어 > [책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글
배열과 포인터의 관계 (1) (0) | 2023.01.26 |
---|---|
전처리 지사자 (2) (0) | 2023.01.11 |
포인터 완전 정복을 위한 포인터 이해하기 (2) (0) | 2022.12.21 |
포인터 완전 정복을 위한 포인터 이해하기 (1) (0) | 2022.12.21 |
포인터의 기본 개념 (2) (0) | 2022.12.20 |