전 처리기
‘전 처리기‘는 말 그대로, 처리하기 ’전‘에 뭔가 처리하는 것이다.(=선행처리기) 이것은 compile(컴파일)에서 컴퓨터 언어를 번역할 때, 번역하기 전에 처리할 것을 기술하는 것이다. ’전 처리기‘의 특징은 #이 맨 앞에 붙는다. 지금까지 배웠던 #이 달린 헤더파일도 모두 ’전 처리기‘에 해당된다.
‘전 처리기’의 대표적인 예로는 지난시간 사용한적 있는 Symbolic constant(심볼릭 상수)의 정의를 들 수 있다. #define MAX 16이라고 하면, MAX이라는 변수가 16으로 만으로 정의돼서, 상수화 되는 것이다. 이때, 전 처리기 #define를 심볼릭 상수의 정의로 사용하게 된다.
매크로
#define을 매크로(Macro)로도 많이 사용한다. 매크로는 함수와 외형적으로 유사하고, 똑같이 쓰이지만, (#define 치환결과(심볼릭 상수) 치환할 것(대상)) 함수와 우선순위가 다르기 때문에, 인수 우선순위를 제대로 정의하지 않으면, 함수와 다른 값이 나온다. (그렇기에 매크로는 인수를 꼭 괄호로 묶어서 우선순위를 확실히 해줘야 된다.)
매크로의 활용을 하면서, #,##라는 신기한 연산자를 볼 수 있다. 매크로 에서의
#은, #에 붙은문자를(#a라고 하면, a를) 문자열처리 해준다.(“a"같이 만들어준다) 그리고 ##은, 양 옆에 붙은문자를 붙여준다.(a##b라고 하면 ab같이 만들어준다) 이렇게 c언어에서는 #도 연산자로 쓰이는데, 대신 ‘전 처리기 한정’으로 쓰는 연산자기 때문에(딴 곳에 쓰면 에러난다) 이렇게 매크로같은 ’전 처리기‘에 활용할 수 있다.
조건부 컴파일
조건부 컴파일은 전 처리기인데, 지정한 조건에 따라서 코드의 일정 부분을 컴파일 할지 안할지를 지정할 수 있다. if조건문과 매우 비슷한데, “#if 조건식1 컴파일 할 명령문1 #elif 조건식2 컴파일 할 명령문2 #else 컴파일 할 명령문3 #endif”와 같이 해줄 수 있다. 그러면 조건식에 따라서 조건식아래의 컴파일 할 명령문으로 코드를 비틀 수 있다. 그래서 같은 코드를 조건에 따라서 다르게 활용할 수 있다. 이걸 이용해서 여러 코드를 뭉칠 수 있기에 유용히 쓰인다.
pragma (프라그마 전 처리기)
#pragma pack(여기서 pack은 ‘메모리 팩킹‘ 이다)로 쓸 수 있는 ‘프라그마 전 처리기’는, compiler(컴파일러)의 옵션을 조정할 수 있다.(이것만 해도 어마어마하게 기능이 많다) 구조체는 메모리가 8바이트씩 되는데, 맴버가 9바이트면 어떻게할까? 16바이트를 만들어서 8바이트 채우고, 다른 8바이트엔 1바이트 채우고, 7바이튼 남겨놓는다. 그 메모리 손실을 처리하는 것이 #pragma pack이다. #pragma pack(push, 1)이라고 하면, 메모리를 무조건 1단위로 계산하게 설정해주는 것이다. 이걸 풀어줄 때는 #pragma pack(pop)로 해주면 된다. 유용하게 쓰이니 잘 알아두자.
#pragma once도 있다. 헤더파일이 다른 소스파일의 헤더파일과 이름이 같아서 겹치는 경우가 있는데, 그런 경우에, 중복되지 않게 다른 헤더파일을 무시해주는 역할이다. 꼭 중복되는 경우가 있을 때는 맨 처음에 달아주는 것 잊지 말자.
#prama comment(lib, "")는 66장에 이미 나왔었다. 정적 라이브러리를 명시할 때 쓰인다. 나온 김에, 정적 라이브러리에 대해서도 복습하고 참고하자.
☕ 마무리
지금까지가 c언어의 모든 내용이다. 여태까지 과제라는 압박에 조금 힘들게 몰아서 한 느낌이 없지 않아 있는데, 이제는 좀 여유롭게 지난 강의도 다시 복습해보고, 마무리 짓자.
'c언어 > 워딩(미정리)' 카테고리의 다른 글
파일 열기와 닫기 및 입출력 (0) | 2019.07.08 |
---|---|
파일의 기본 이해 (0) | 2019.07.08 |
정렬 및 연습문제 (0) | 2019.07.08 |
선형구조 및 연결 리스트 (0) | 2019.07.08 |
비트필드, 공용체 (0) | 2019.07.08 |