매크로 함수와 미리 정의된 매크로

✒️ 2025-05-15 15:52 내용 수정

수제비 2024 정보처리기사 필기 5판 1권의 내용을 정리
TCPSchool의 내용을 참고하여 정리


매크로 함수

함수처럼 동작하는 매크로

#include <stdio.h>
#define ADD(A, B) A+B

int main(void)
{
	int result;
	int num1 = 10, num2 = 5;

	printf("%d와 %d의 합 : %d\n", num1, num2, ADD(num1, num2));
	return 0;
}
10와 5의 합 : 15
#include <stdio.h>
#define ADD(A, B) A+B
#define MULT(X) X*X

int main(void)
{
	int result;
	int num1 = 10, num2 = 5;

	//printf("%d와 %d의 합 : %d\n", num1, num2, ADD(num1, num2));

    printf("%d의 제곱 : %d\n", num1, MULT(num1));
    printf("%d의 제곱 : %d\n", num1+1, MULT(num1+1)); // 일반 함수와는 다르게 동작
	return 0;
}
10의 제곱 : 100
11의 제곱 : 21
#include <stdio.h>
#define ADD(A, B) A+B
#define MULT(X) (X)*(X) // ()로 인자를 묶기

int main(void)
{
	int result;
	int num1 = 10, num2 = 5;

	//printf("%d와 %d의 합 : %d\n", num1, num2, ADD(num1, num2));

    printf("%d의 제곱 : %d\n", num1, MULT(num1));
    printf("%d의 제곱 : %d\n", num1+1, MULT(num1+1));
	return 0;
}
10의 제곱 : 100
11의 제곱 : 121

#, ## 연산자

  1. # 연산자 : 매크로 함수의 대체 리스트(replacement-list) 안의 인수 앞에 사용하여 토큰을 문자열로 변환 시켜준다.
    • "#인수" 형태로 사용한다.
    • 예제를 보면 해당 토큰을 실인수로 치환하여 그대로 문자열 상수에 변환된다.
#include <stdio.h>
#define SQR(X) printf("("#X")의 제곱 : %d\n", ((X)*(X)))

int main(void)
{
    int x = 8;
    SQR(x);
    SQR(10 + 5);
    return 0;
}
(x)의 제곱 : 64
(10 + 5)의 제곱 : 225
  1. ## 연산자 : 두 개의 토큰을 하나의 토큰으로 결합해준다.
    • 객체 같은 매크로의 대체 리스트에도 사용할 수 있다.
    • 연산자 사용 시 변수나 함수 이름을 프로그램의 런타임에 정의(동적)할 수 있다.
#include <stdio.h>
#define XN(n) x ## n

int main(void)
{
    int XN(1) = 10;

    printf("x1에 저장된 값 : %d\n", x1);
    return 0;
}
x1에 저장된 값 : 10

미리 정의된 매크로

매크로 설명
__DATE__ 선행처리가 "Mmm dd yyyy" 형식으로 날짜를 문자열로 나타냄
__TIME__ 선행처리가 "hh:mm:ss" 형식으로 시간을 문자열로 나타냄
__FILE__ 현재 소스 파일의 이름을 나타내는 문자열
__LINE__ 현재 소스 파일에서 처리 중인 라인 번호를 나타내는 문자열
__STDC__ 컴파일러가 C 표준을 따르면 1로 설정
__STDC_HOSTED__ 호스트 환경이 아니면 0, 호스트 환경이면 1로 설정
#include <stdio.h>

int main(void)
{
    printf("선행처리 수행된 날짜 %s\n", __DATE__);
    printf("선행처리 수행된 시간 %s\n", __TIME__);
    printf("소스 파일 이름 : %s\n", __FILE__);
    printf("현재 소스 파일에서 처리 중인 라인 번호 : %d\n", __LINE__);
    printf("__STDC__ : %d\n", __STDC__);
    printf("__STDC_HOSTED__ : %d\n", __STDC_HOSTED__);
    return 0;
}
선행처리 수행된 날짜 Apr
선행처리 수행된 시간 12:54:45   
소스 파일 이름 : C:\Users\user\Desktop\CPractice\defineTest\predefinedMacro.c
현재 소스 파일에서 처리 중인 라인 번호 : 8
__STDC__ : 1
__STDC_HOSTED__ : 1