[C] 15. 매크로 함수 / 인라인 함수

Wonder_Land🛕·2022년 8월 1일
0

[C]

목록 보기
16/18
post-thumbnail
  1. 매크로 함수
  2. 인라인 함수
  3. Q&A
  4. 마치며

1. 매크로 함수

C언어에서는 #define에 함수를 정의함으로써, 함수처럼 동작하는 매크로를 만들 수 있습니다.

이 매크로를 '매크로 함수'라고 합니다.

  • 매크로 함수
#define 함수이름(인자) 치환내용

다음 예시를 봅시다.

#include <stdio.h>
#define square(x) x*x

int main(int argc, char** argv) {
	printf("Square(3) : %d\n", square(3));

	return 0;
}

[Result]
Square(3) : 9

위의 예시에서

#define square(x) x*x

의 의미는,
인자로 x를 받는 매크로 함수 sqaure는,
x*x로 치환한다는 말입니다.

우리가 이를 매크로 '함수'라고 부르는 이유는,
정말 함수와 비슷하게 작동되기 때문입니다.

만약 int square(x)라는 함수를 만들어,
x*x를 반환하게 했다면 똑같은 결과겠죠.

하지만, 매크로 함수와 진짜 함수는 엄연한 차이가 있습니다.

컴파일러는

printf("Square(3) : %d\n", square(3));

라는 문장을 컴파일 되기 전에 다음과 같이 바꿉니다.

printf("Square(3) : %d\n", 3 * 3);

즉, 함수를 호출하는 것이 아닌,
#define과 같이 컴파일 전에 내용을 '치환'하는 것입니다.

다음 예시를 볼까요?

#include <stdio.h>
#define square(x) x*x

int main(int argc, char** argv) {
	printf("Square(3 + 1) : %d\n", square(3 + 1));

	return 0;
}

[Result]
Square(3 + 1) : 7

????
왜 결과로 7이 나올까요?
당연히 16이 나와야 할텐데 말이죠...

앞서 말했듯이, 매크로 함수는 단순히 '치환'만 합니다.

그래서

printf("Square(3 + 1) : %d\n", square(3 + 1));

printf("Square(3 + 1) : %d\n", square(3 + 1 * 3 + 1));

처럼 치환해버립니다.

하...
그럼 우리가 원하는 방식으로 하려면요?

#define square(x) x*x

#define square(x) (x) * (x)

로 바꾸면 됩니다.

따라서, 매크로함수에서 수식을 이용하려면,
꼭 괄호를 통해 수식을 표현해 주세요.

이러한 어렵고 귀찮은 과정 덕분에 오류가 나는 경우가 많습니다.

따라서 C에서는 또 다른 기능을 제공하는데요,
바로 '인라인(inline)'함수입니다.


2. 인라인 함수

인라인 함수는,
일반적인 함수의 호출 과정을 거치지 않고,
함수의 모든 코드를, 호출된 자리에 바로 삽입하는 방식의 함수입니다.

#include <stdio.h>

// inline 함수
__inline int square(int a) { return a * a; }

int main(int argc, char** argv) {
	printf("%d", square(3));

	return 0;
}

[Result]
9

만약 이 부분이

__inline int square(int a) { return a * a; }

일반 함수였다면 어떨까요?

main함수에서 해당 함수로 흐름이 바뀌게 됩니다.
그리고 해당 함수가 끝이 나면 다시 흐름이 main함수로 바뀝니다.

이게 일반적인 함수의 호출 과정입니다.
이렇게 되면 함수의 호출 시간이 필요합니다.

이러한 것을 효과적으로 처리하기 위한 것이 '인라인 함수'입니다.

우리가 위의 예제에서 만든 square함수는,
일반적인 함수가 아닙니다.

int main(int argc, char **argv) {
  printf("%d", square(3));
  return 0;
}

int main(int argc, char **argv) {
  printf("%d", 3 * 3);
  return 0;
}

로 바뀝니다.

매크로 함수와 차이가 있다면,
인라인 함수는 전처리기가 치환해버리는 것이 아닌,
우리가 '진짜 함수를 사용하는 것처럼' 바꿔줍니다.


많은 사람들이 매크로 함수보다, 인라인 함수를 사용하도록 권장하고 있습니다.

인라인 함수는 매크로 함수와 달리,
컴파일러가 처리하기 때문에 훨씬 더 명확하게 동작하고,
매크로 함수와 달리 인자들의 타입도 확인해주기 떄문이죠.

또한, 진짜 함수처럼 작동하기 때문에,
훨씬 구현하기도 쉽습니다.
(디버깅도 더 편하죠)


3. Q&A

-


4. 마치며

-

[Reference] : 위 글은 다음 내용을 참고, 인용하여 만들어졌습니다.

profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글