전처리기
Compile 하기전에 선행 처리하는 구문 (CPU 연산 X, only compile time)
어떤걸 처리하는가? -> 코드를 변형시킨다.
#으로 시작한다.
#include
외부 file을 현재 Source code의 위에 포함해 함께 compile 하는 것
~.h를 include 한 것은 그 code를 ~.c 위에 직접 작성한 것과 동일
"~.h" : 헤더파일이 현재 디렉터리에 존재하는 경우
<~.h> : 헤더파일이 컴파일러 설정에 따른 시스템 디렉터리에 존재하는 경우
macro
한 행 혹은 여러 행으로 기술할 수 있는 구문
자주 반복되며 길이가 짧은 코드를 함수로 만들면 코드를 보기는 쉽지만 오버해드가 크기때문에 사용
정의할 때 가장 바깥에 ( ) 를 빼면 우선순위와 같은 문제가 발생할 수 있다.
또한 매개변수의 자료형이 정의되어있지 않기 때문에 예상치못한 버그가 발생할 수 있으므로 가급적 사용을 자제하자.
__inline 함수
macro의 장점과 함수의 장점을 합친 것
문법적으로 함수와 동일하지만 컴파일러의 판단하에 줄일 수 있다고 판단되면 함수 호출을 하지않게 코드를 변경한다.
컴파일러가 자동으로 판단, 처리 하기에 굳이 신경 쓸 필요는 없다.
매크로 특수화 연산자 #, ##
# : 인수를 문자열로 만들어주는 연산자
## : 두 매개변수를 한 덩어리로 묶어 코드를 만듬 ex) a##b = ab
조건부 컴파일
상수 정의에 따라 실제로 번역되는 소스코드가 달라지도록 구성하는 것
#if xxx, #else, #endif ...
문자열 처리 (unicode vs mbcs), 빌드 모드 (_DEBUG) 선택에 많이 쓰인다.
연습문제)
1) 다음 매크로 정의의 문제점은 무엇인가?
#define ADD(a, b) a + b
Q )
a + b 겉에 괄호가 없기에 ADD(a, b) * 2 와 같은 연산을 수행할 경우 우선순위 문제가 생길 수 있다.
또한 printf("%d\n", ADD(3 + 4.5)); 처럼 자료형을 이상하게 넣을 경우에 warning 이나 error는 발생하지 않고 이상한 값을 출력하기도 한다.
2) __inline 함수와 매크로의 공통점은 무엇인지 설명하세요.
Q )
단순한 코드지만 자주 반복되는 코드를 일일이 입력하지 않고 함수처럼 보이게 사용할 수 있으며 그럼에도 불구하고 call stack이 없어 오버헤드도 존재하지 않아 성능상 함수에 비해 우월하다.
하지만 매크로는 () 문제, 매개변수 문제등으로 인해 __inline함수 에 비해 뛰어난 점이 별로 없으므로 가급적이면 __inline함수를 사용하는것이 좋다.
- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼)
'Programming > C language' 카테고리의 다른 글
Chapter 17. 함수에 대한 고급이론 (0) | 2017.07.05 |
---|---|
Chapter 15. 변수와 상수 고급 이론 (0) | 2017.07.04 |
Chapter 14. 파일 입출력 (0) | 2017.07.03 |
Chapter 13. 구조체와 공용체 (0) | 2017.07.02 |
Chapter 12. 함수 응용 (문제풀이) (0) | 2017.06.30 |