매크로 함수

#1. 매크로 함수란?

#2. 괄호 속에 있는 이유는?

#3. 매크로와 함수 및 템플릿의 비교

#4. 인라인 함수란?

#5. 문자열 조작

#6. 문자열화 연산자

#7. 결합연산자

#8. 내장매크로

#9. assert()

 

#1. 매크로 함수란? (a)

  - 매크로 함수는 #define을 사용하여 만들어지는 기호이다. 이 기호는 함수처럼 하나의 인수를 가진다.

  - 전처리기는 특정 인수가 무엇이든 상관없이 치환 문자열로 대치한다.

  1.        #define TWICE(x) ( (x) * 2 )

  - 매크로는 하나 이상의 매개 변수를 가질 수 있고, 반복해서 사용할 수 있다.

  1.        #define MAX(x,y) ( (x) > (y) ? (x) : (y) )
  2.        #define MIN(x,y) ( (x) < (y) ? (x) : (y) )

  [주의] 매크로 함수 정의에서 매개 변수 목록에 대한 여는 괄호가 매크로 이름 바로 다음에 빈칸 없이 곧바로 이어져야 한다.

 

#2. 괄호 속에 있는 이유는? (b)

  - 전처리기는 치환 문자열의 인수 주위에 괄호가 있을 것을 요구하지 않지만, 괄호는 복잡한 값을 매크로에 전달할 경우 원하지 않는 결과가 나오는 것을 방지하는데 도움을 준다.

#3. 매크로와 함수 및 템플릿의 비교 (c)

  - 문제점

    ① 매크로가 커질 경우 혼란스러워질 수 있다.

    ② 사용한 곳에서 곧바로 인라인으로 확장된다.

    ③ 매크로가 컴파일러에서 사용하는 중간 소스 코드에 나타나지 않는다. 대부분의 대버거에서 사용할 수 없다.

    ④ 형에 안전하지 않다.

#4. 인라인 함수란? (d)

  - 확장인라인 : 함수의 내용이 함수가 호출된 코드에 삽입되는 것을 말한다.

  1.     inline unsigned long Square(unsigned long a) { return a * a; }

#5. 문자열 조작 (e)

  - 문자열화 연산자(#)는 이 연산자 다음에 나오는 것은 무엇이든 간에 겹따옴표 속에 넣어 문자열로 만든다.

#6. 문자열화 연산자 (f)

  - 문자열화 연산자는 그 연산자 다음에 나오는 어떤 글자들이라도 다음 공백 문자까지 겹따옴표로 둘러싸게 된다.

  1.        #define WRITERSTRING(x) count << #x
  2.        WRITERSTRING(This is a string);    =     count << "This is a string";

#7. 결합연산자 (g)

  - 결합연산자는 하나 이상의 용어를 합쳐서 새로운 단어로 만들어 내는 것이다.

  - 새 단어란 실제로 클래스 이름, 변수 이름, 배열에 대한 오프셋, 또는 어떤 것이든 나타날 수 있는 문자열로 사용할 수 있다.

  1.         #define fPrint(x) f ## x ## print
  2.         #define Listof(Type) class Type##List \
  3.          { \
  4.              public : \
  5.              Type##List(){} \
  6.              private : \
  7.              int itsLength; \
  8.          };

#8. 내장매크로 (h)

  - 많은 컴파일러들은 몇가지 유용한 매크로들을 내장하고 있다.

  - _DATE_ : 현재 날짜

     _TIME_ : 현재 시간

     _LINE_ : 소스코드 행 번호

     _FILE_ : 소스코드 파일 이름


  - 프로그램에서 사용하는 이름들과 겹칠 가능성을 줄이기 위해 두 개의 밑줄로 둘러 싸여 있다.

#9. assert() (i)

  - 매개 변수가 참으로 평가될 경우 참을 반환하고, 거짓으로 평가될 경우 몇 가지 종류의 동작을 한다.

  - 많은 컴파일러들이 assert()가 실패할 경우 프로그램을 강제로 종료한다. 그밖의 컴파일러들은 예외를 발생시킨다.

  - DEBUG가 정의되지 않을 경우 전처리기가 이 매크로를 무시한다. 수행성의 낭비나 실행 버전 프로그램의 크기의 증가가 없다.

  1.         #define DEBUG
  2.         #ifdef DEBUG
  3.              #define ASSERT(x)
  4.         #else
  5.              #define ASSERT(x) \
  6.                      if( !(x) ) \
  7.                      { \
  8.                            cout << "ERROR!! Assert " << #x << " falied\n"; \
  9.                            cout << "On line " << _LINE_ << "\n"; \
  10.                            cout << "in file" << _FILE_ << "\n"; \
  11.                       }
  12.          #endif

출처 : http://lonelysm.springnote.com/pages/4011761?print=1#h

+ Recent posts