매크로 함수
#1. 매크로 함수란? (a)
- 매크로 함수는 #define을 사용하여 만들어지는 기호이다. 이 기호는 함수처럼 하나의 인수를 가진다.
- 전처리기는 특정 인수가 무엇이든 상관없이 치환 문자열로 대치한다.
- #define TWICE(x) ( (x) * 2 )
- 매크로는 하나 이상의 매개 변수를 가질 수 있고, 반복해서 사용할 수 있다.
- #define MAX(x,y) ( (x) > (y) ? (x) : (y) )
- #define MIN(x,y) ( (x) < (y) ? (x) : (y) )
[주의] 매크로 함수 정의에서 매개 변수 목록에 대한 여는 괄호가 매크로 이름 바로 다음에 빈칸 없이 곧바로 이어져야 한다.
#2. 괄호 속에 있는 이유는? (b)
- 전처리기는 치환 문자열의 인수 주위에 괄호가 있을 것을 요구하지 않지만, 괄호는 복잡한 값을 매크로에 전달할 경우 원하지 않는 결과가 나오는 것을 방지하는데 도움을 준다.
#3. 매크로와 함수 및 템플릿의 비교 (c)
- 문제점
① 매크로가 커질 경우 혼란스러워질 수 있다.
② 사용한 곳에서 곧바로 인라인으로 확장된다.
③ 매크로가 컴파일러에서 사용하는 중간 소스 코드에 나타나지 않는다. 대부분의 대버거에서 사용할 수 없다.
④ 형에 안전하지 않다.
#4. 인라인 함수란? (d)
- 확장인라인 : 함수의 내용이 함수가 호출된 코드에 삽입되는 것을 말한다.
- inline unsigned long Square(unsigned long a) { return a * a; }
#5. 문자열 조작 (e)
- 문자열화 연산자(#)는 이 연산자 다음에 나오는 것은 무엇이든 간에 겹따옴표 속에 넣어 문자열로 만든다.
#6. 문자열화 연산자 (f)
- 문자열화 연산자는 그 연산자 다음에 나오는 어떤 글자들이라도 다음 공백 문자까지 겹따옴표로 둘러싸게 된다.
- #define WRITERSTRING(x) count << #x
- WRITERSTRING(This is a string); = count << "This is a string";
#7. 결합연산자 (g)
- 결합연산자는 하나 이상의 용어를 합쳐서 새로운 단어로 만들어 내는 것이다.
- 새 단어란 실제로 클래스 이름, 변수 이름, 배열에 대한 오프셋, 또는 어떤 것이든 나타날 수 있는 문자열로 사용할 수 있다.
- #define fPrint(x) f ## x ## print
- #define Listof(Type) class Type##List \
- { \
- public : \
- Type##List(){} \
- private : \
- int itsLength; \
- };
#8. 내장매크로 (h)
- 많은 컴파일러들은 몇가지 유용한 매크로들을 내장하고 있다.
- _DATE_ : 현재 날짜
_TIME_ : 현재 시간
_LINE_ : 소스코드 행 번호
_FILE_ : 소스코드 파일 이름
- 프로그램에서 사용하는 이름들과 겹칠 가능성을 줄이기 위해 두 개의 밑줄로 둘러 싸여 있다.
#9. assert() (i)
- 매개 변수가 참으로 평가될 경우 참을 반환하고, 거짓으로 평가될 경우 몇 가지 종류의 동작을 한다.
- 많은 컴파일러들이 assert()가 실패할 경우 프로그램을 강제로 종료한다. 그밖의 컴파일러들은 예외를 발생시킨다.
- DEBUG가 정의되지 않을 경우 전처리기가 이 매크로를 무시한다. 수행성의 낭비나 실행 버전 프로그램의 크기의 증가가 없다.
- #define DEBUG
- #ifdef DEBUG
- #define ASSERT(x)
- #else
- #define ASSERT(x) \
- if( !(x) ) \
- { \
- cout << "ERROR!! Assert " << #x << " falied\n"; \
- cout << "On line " << _LINE_ << "\n"; \
- cout << "in file" << _FILE_ << "\n"; \
- }
- #endif
출처 : http://lonelysm.springnote.com/pages/4011761?print=1#h