study/C언어

define 매크로와 inline 함수

IT공부 2020. 6. 29. 17:41
반응형

매크로(define)란?

  • 여러 번 사용하게 될 상수를 문자로 표현하여 변경 시에도 편리하게 사용할 수 있도록 하는 것

  • 매크로 상수는 컴파일 전에 전처리기에 의해서 숫자로 치환됩니다.


#define [이름] [숫자]

  • 매크로 사용 예시

#include <stdio.h>
#include <stdlib.h> 
#define MAX_LEN 20


int main(void)
{
	int* arr = (int*)malloc(sizeof(int) * MAX_LEN);
	int i;
	for(i = 0; i < MAX_LEN; i++)
	{
		arr[i] = i+1;
	}
	
	for(i = 0; i < MAX_LEN; i++)
	{
		if(i % 5 == 0) printf("\n");
		printf("%d ", arr[i]);
	}
	
	free(arr);
	return 0;
}

출력 화면

  • 매크로 방식이 아닌 기존 방식대로 정수를 넣어서 반복문을 사용할 경우

    • 데이터의 양이 바뀌게 된다면 예를 들어 30으로 데이터의 양이 바뀌게 되면 모든 코드를 수정해야 한다.

    • 하지만 매크로를 사용한 코드에서 맨 위의 매크로 하나만 바꾸어 주면 되기 때문에 사용하기 편해진다.


매크로(define) 함수 

  • 매크로를 이용하여 함수의 역활을 대신하는 것 

  • 파라미터를 받을 수 있으며, 반환할 수 있다. 

#define [함수이름](인자, 인자) [계산]

  • ex) #define SUM(a,b) (a+b)

매크로 함수 예시

#include <stdio.h>
#define SUM(a,b) a+b
#define MUL(a,b) a*b

int Func_mul(int a, int b)
{
	return a*b;
}

int main(void)
{
	printf("%d\n", SUM(10,20));
	printf("%d\n", MUL(10,20));
	
	printf("%d\n", MUL(10+3, 20+2));
	printf("%d\n", Func_mul(10+3, 20+2));
	
	return 0;	
	
}

출력 결과 

  • 첫번첫 번 째첫 번째 두 번째 매크로 함수는 정상적으로 동작합니다. 

  • 세 번째 매크로 함수와 네 번째 일반 함수 동작 결과가 다릅니다. 

    • 이유는 #define 매크로는 단순 치환을 해주기 때문입니다.

    • MUL(10+3, 20+2)는 전처리기에 의해 10+3 * 20 + 2로 계산이 되어 10+60+2 =72가 됩니다


inline(인라인)이란?

  • 매크로 함수의 단점을 보완하고자 일반 함수의 성향을 빌려온 함수 

  • 컴파일러가 지능적으로 판단하여 인 라이닝을 하는 것과, 일반 함수처럼 동작 

  • inline은 함수 호출처럼 스택으로 불리는 것이 아니라 치환되어 사용 

  • 함수 선언 시 inline을 앞에 붙여 준다.

사용 예시

inline int func_add(int a, int b) {return a*b}

#include <stdio.h>
#define MUL(a,b) ((a)*(b))
#define MAX(a,b) ((a)>(b)?(a):(b)) 

inline int func_mul(int a, int b)
{
	return a*b;
}

inline int func_max(int a, int b)
{
	return a>b?a:b;
}

int main(void){
	printf("%d\n", MUL(10 + 3, 20 + 2));     	//macro
	printf("%d\n", func_mul(10 + 3, 20 + 2));	//inline
	
	
	printf("%d\n", MAX(10, 20));
	printf("%d\n", func_max(10, 20));
	
	printf("%d\n", MAX(10 + 3, 20 + 2));
	printf("%d\n", func_max(10 + 3, 20 + 2));
	
	return 0; 
}

출력 결과