happy coding

[c] 매크로 함수 본문

self study/언어의 기본부터

[c] 매크로 함수

yeoonii 2022. 11. 27. 23:48
TCP school 을 보고 정리한 내용입니다.

매크로 함수

C언어에서, #define 선행처리 지시문에 인수로 함수의 정의로 전달함으로서, 함수처럼 동작하는 매크로를 만들 수 잇는데, 이러한 매크로를 함수 같은 매크로(function-like-macro) 또는 매크로 함수라고 한다.

함수와 매크로 함수

매크로 함수는 일반 함수와는 달리 단순 치환만을 해주므로, 일반 함수와 완전히 똑같은 방식으로 동작하지는 않는다. 예를 들어, 일반 함수는 인수를 프로그램이 실행 중일 때 전달받지만, 매크로 함수는 인수를 컴파일 이전에 미리 치환한다. 다른 결과값이 반환되는 오류를 미리 방지하기 위해서 각 인수를 모두 괄호로 묶어줘야 한다.


1. 매크로 함수의 전체를 괄호(())로 감싸야 합니다.

2. 매크로 함수의 인수들도 각각 괄호로 감싸야 합니다.

3. 매크로 함수를 호출할 때에는 증감 연산자(++, --)나 복합 대입 연산자 등은 사용하지 않는 것이 좋습니다.

매크로 함수는 얼핏 함수처럼 보이지만 일반 함수와는 전혀 다른 시간대에 이루어지는 다른 과정임을 명심해야 한다.


매크로 함수의 장단점

1. 매크로 함수는 단순 치환만을 해주므로, 인수의 타입을 신경 쓰지 않습니다.

2. 매크로 함수를 사용하면 여러 개의 명령문을 동시에 포함할 수 있습니다.

3. 함수 호출에 의한 성능 저하가 일어나지 않으므로, 프로그램의 실행속도가 향상됩니다.

...

1. 원하는 결과를 얻는 정확한 매크로 함수의 구현은 어려우며, 따라서 디버깅 또한 매우 어렵습니다.

2. 매크로 함수의 크기가 증가하면 증가할수록 사용되는 괄호 또한 매우 많아져서 가독성이 떨어집니다.

매크로 함수는 크기가 큰 함수보다는 간단한 함수를 대체하는 데 사용하는 것이 좋다.

#과 ## 연산자

이 연산자들은 선행처리기 연산자로 #define 선행처리 지시문에서만 사용되는 연산자이다. C언어에서 토큰이란 컴파일러가 인식하는 최소 단위의 문자나 문자열을 의미하는데, 이 두 연산자는 이러한 토큰 단위의 연산에서 사용된다.

# 연산자

# 연산자는 매크로 함수의 대체 리스트 안의 인수 앞에 사용하여, 토큰을 문자열로 변환시켜준다. 해당 토큰은 실인수로 치환되면서 양쪽에 위치한 큰따옴표를 포함해 그대로 문자열 상수로 변환된다. 그리고 그 연산자를 사용하면 문자열 안에 매크로 함수로 전달된 인수를 포함시킬 수 있다.

## 연산자

## 연산자는 두 개의 토큰을 하나의 토큰으로 결합해주는 선행처리기 연산자이다. 이 연산자는 함수 같은 매크로뿐만 아니라 객체 같은 매크로의 대체 리스트에도 사용할 수 있다. 그리고 이 연산자를 사용하면 변수나 함수의 이름을 프로그램의 런타임에 정의할 수 있다.

#include <stdio.h>
#define XN(n) x ## n	//변수의 이름을 동적으로 작성
#define PRT_XN(n) printf("x"#n"에 저장된 값은 %d이다.\n",x ## n)	//동적으로 작성한 변수의 이름에 접근

'self study > 언어의 기본부터' 카테고리의 다른 글

[c] 헤더 파일  (0) 2022.11.28
[c] 미리 정의된 매크로(predefined macro)  (0) 2022.11.27
[c] 선행처리기  (0) 2022.11.27
[c] 파일 입출력 함수  (0) 2022.11.27
[c] 파일 입출력  (0) 2022.11.27
Comments