2015년 7월 27일 월요일

20150728 선행처리기와 매크로

선행처리는 컴파일 이전의 처리를 의미

컴파일의 5단계 참조 사이트 http://www.hanbit.co.kr/network/view.html?bi_id=1013
컴파일 세부 명령어 참조 사이트
https://msdn.microsoft.com/ko-kr/library/9s7c9wdw(v=vs.120).aspx

전처리 단계 = cl /P 파일 // i파일 생성

★대표적인 선행처리 명령문
#define : Object-like macro // 오브젝트(object) 유사 매크로(#define PI 3.14 == PI=3.14)

★매크로 함수의 장점
☆일반 함수에 비해 실행속도가 빠르다!
☆자료형에 따라서 별도로 함수를 정의하지 않아도 된다!

아래의 일반적인 함수를 호출시 동반되는 사항들과 다르게 매크로 함수의 몸체부분이
매크로 함수의 호출 문장을 대신하기 때문에 실행속도상의 이점이 있다.
// 호출된 함수를 위하 스택 메모리의 할당
// 실행위치의 이동과 매개변수로의 인자 전달
// return 문에 의한 값의 반환

★매크로 함수의 단점
☆정의하기가 정말로 까다롭다!
☆디버깅하기가 쉽지 않다!

★매크로 함수의 장단점에 의해서 이러한 함수들을 매크로로 정의한다
☆작은 크기의 함수
☆호출의 빈도수가 높은 함수

매크로는 매개변수가 존재하는 형태로도 정의할수 있다!함수와 유사한 매크로=매크로함수
#define : Function-like macro // #define SQUARE(X) X*X == SQUARE(123); == 123*123;

★매크로 몸체에 괄호를 아래처럼 최대한 사용
#define SQUARE(X) ((X)*(X))

☆매크로를 두 줄 이상에 걸쳐서 정의할 때에는 아래와 같이 \ 문자를 활용!
#define SQUARE(X) \
           ((X)*(X))

☆매크로 정의 시, 먼저 정의된 매크로도 사용이 가능!
#define PI 3.14
#define PRODUCT(X, Y) ((X)*(Y))
#define CIRCLE_AREA(R) (PRODUCT((R), (R))*PI)

조건부 컴파일(Conditional Compilation)을 위한 매크로
#if... #endif : 참이라면 코드 삽입
#ifdef... #endif : 정의되었다면 #ifdef는 매크로가 정의되었는지를 기준으로 동작
#ifndef... #endif : 정의되지 않았다면
#else 위의 3개에 추가 가능
#elif의 삽입 : #if에만 해당

★문자열 안에서는 매크로의 매개변수 치환이 발생하지 않는다!
#define STR(ABC) #ABC // 매개변수 ABC에 전달되는 인자를 문자열 ABC로 치환해라!

☆특별한 매크로 연산자 없이 단순히 연결하는 것은 불가능하다!

★필요한 형태대로 단순하게 결합하기 : 매크로 ## 연산자
#define CON(UPP, LOW) UPP ## 00 ## LOW // int A=CON(22, 77); == int A=220077

댓글 없음:

댓글 쓰기