선행처리란
- 컴파일 이전의 처리를 의미한다.
선행처리 명령문은 #문자로 시작을 하며,
컴파일러가 아닌 선행처리기에 의해서 처리되는 문장이기 때문에 명령문의 끝에 세미콜론을 붙이지 않는다.
대표적인 선행처리 명령문
#define : 오브젝트 유사 매크로(Object -like macro)
- 오브젝트라는 것은 그 자체로 '완전한 의미를 갖는 대상이나 사물'을 의미한다.
- 아래에서 정의한 매크로 PI는 그 자체로 3.14.15라는 상수를 의미하기 때문에
'오브젝트와 유사한 매크로' 또는 '오브젝트와 비슷한 매크로'라 하는 것이다.
|
"매크로 PI를 매크로 몸체 3.14.15로 치환하세요"라는 문장이다.
매크로의 이름은 대문자로 정의하는 것이 일반적이다.
대문자로 정의함으로써 이 식별자가 매크로라는 사실을 부각시킬 수 있기 때문이다.
#define : 매크로 함수(or 함수와 유사한 매크로; Function-like macro)
- 매크로는 매개변수가 존재하는 형태로도 정의할 수 있다.
|
매크로 몸체에 괄호를 마구 쳐라!
매크로 몸체에 해당하는 X 부분에 괄호를 잘 쳐주지 않는 다면 잘못된 치환이 이뤄질 수 있다.
그러므로 아래처럼
#define SQUARE(X) ((X)*(X)) |
매크로 함수를 정의할 때에는 매크로의 몸체부분을 구성하는 X와 같은 전달인자 하나하나에괄호를 해야 함을 물론이고,
반드시 전체를 괄호로 한번 더 묶어 줘야 한다는 사실을 기억하라!
매크로를 두 줄에 걸쳐서 정의하려면 \문자를 활용하라!
매크로는 한 줄에 정의하는 것이 원칙이다.
두 줄 이상에 걸쳐서 정의 할때는 아래와 같이 하라.
#define SQUARE(X) \ ((X)*(X)) |
매크로 함수의 장점
1. 매크로 함수는 일반 함수에 비해 실행속도가 빠르다.
2. 자료형에 따라서 별도로 함수를 정의하지 않아도 된다.
1. 매크로 함수의 실행속도가 빠른 이유는?
함수가 호출되면 다음 사항들이 동반된다.
- 호출된 함수를 위한 스택 메모리의 할당
- 실행위치의 이동과 매개변수로의 인자 전달
- return문에 의한 값의 반환
따라서 함수의 빈번한 호출은 실행속도의 저하로 이어진다.
반면 매크로 함수는 선행처리기에 의해서 매크로 함수의 몸체부분이 매크로 함수의 호출 문장을 대신하기 때문에,
위에서 언급한 사항들을 동반하지 않으므로 실행속도상의 이점이 있다.
2. 자료형에 따라서 별도의 함수를 정의 하지 않는다?
매크로 함수의 호출문장이 매크로 함수의 몸체부분으로 단순히 치환되기 때문에 가능한 일이다.
매크로 함수의 단점
1. 정의하기가 정말로 까다롭다.
2. 디버깅하기가 쉽지 않다.
매크로로 정의하는 함수
- 작은 크기의 함수
- 호출의 빈도수가 높은 함수
조건부 컴파일(Conditional Compilation)을 위한 매크로
#if... #endif : 참이라면
- 조건부 코드 삽입을 위한 지시자
- 참이냐 거짓이냐를 기준으로 동작
#ifdef... #endif : 정의되었다면
- 조건부 코드 삽입을 위한 지시자
- 매크로가 정의 되었냐, 정의되지 않았냐를 기준으로 동작
#ifndef... #endif : 정의되지 않았다면
#else의 삽입 : #if, #ifdef, #ifndef에 해당
#elif의 삽입 : #if에만 해당
매개변수의 결합과 문자열화
문자열 내에서는 매크로의 매개변수 치환이 발생하지 않는다.
문자열 내에서 매크로의 매개변수 치환이 발생하게 만들기 : #연산자
#define STR(ABC) #ABC |
위의 문장은 "매개변수 ABC에 전달되는 인자를 문자열 "ABC"로 치환하세요."라고 이해하면 된다.
한가지 더, 문자열은 나란히 선언하면, 하나의 문자열로 간주된다.
char *str = "ABC" "DEF"; //는 char *str = "ABCDEF"; //와 동일
char *str = STR(12) STR(34); //는 치환되어 char *str = "12" "34"; //가 되어 char *str = "1234"; //와 동일 |
특별한 매크로 연산자 없이 단순히 연결하는 것은 불가능하다.
필요한 형태대로 단순하게 결합하려면 ##연산자를 쓰면 된다.
- ##연산자는 매크로 함수의 전달인자를 다른 대상(전달인자,숫자,문자,문자열 등)과 이어줄 때 사용한다.
- 윤성우 저, 열혈강의 C프로그래밍 中 -
'Programming Study > C' 카테고리의 다른 글
파일의 분할과 헤더파일의 디자인 (0) | 2014.09.05 |
---|---|
메모리 관리와 메모리 할당 (0) | 2014.09.05 |
파일 입출력 (0) | 2014.09.04 |
구조체와 사용자 정의 자료형_2 (0) | 2014.09.04 |
구조체와 사용자 정의 자료형_1 (0) | 2014.09.04 |