2021. 8. 16. 10:47ㆍC++
// include(전처리 지시자)
1. 개요
- 지정한 파일의 내용을 불러와 지시자(include)가 있는 위치에 붙여놓는다.
2. 사용법
#include <파일명> or #include "파일명"
-> 붙여넣을 파일명 꺾쇠괄호나 큰 따옴표로 묶는다.
3. 꺾쇠괄호와 큰따옴표의 구분
- 꺾쇠괄호 : 컴파일러가 설정한 include 디렉토리에서 찾는다.
- 큰따옴표 : 소스 파일이 저장된 디렉토리에서 먼저 찾는다.
4. 특징
- 프로그램을 깔끔하고 편하게 작성할 수 있다.
- 하나의 프로그램은 독립적으로 컴파일이 가능한 파일 단위인
모듈(module)로 나누어 분할 컴파일한다.
- 각 모듈이 같이 사용하는 구조체나 함수 또는 전역 변수의 경우,
각 선언을 하나의 헤더 파일로 만들면 필요한 모듈에서 쉽게 포함하여
쓸 수 있다.
- 헤더 파일의 내용이 수정되더라도 컴파일만 다시 하면
수정된 내용이 모든 파일에 동시 적용되므로 빠르고 정확한 빌드가 가능하다.
2.define
1) 개요
- 매크로(이름)를 만드는 전처리 지시자
2) 사용법
#define [매크로명] [치환될 부분]
-> 다른 변수명과 쉽게 구분할 수 있도록 관례상 대문자로 표기
3) 장점
- 자주 사용하는 복잡한 상수나 문자열을 의미 있는 단어로 치환할 수 있다
- 매크로를 정의할 때 치환될 부분이 너무 긴 나머지,
여러 줄에 나눠서 써야할 경우엔 백슬래시(\)로 연결할 수 있다.
4) 단점
- 문제(=버그)가 발생하면 매크로가 어떤 형태로 치환되는지
다시 확인해야 하므로 디버깅과 유지보수가 힘들다.
- 컴파일러는 전처리가 끝난 후에 치환된 소스 코드로 컴파일하고,
사용자는 매크로로 작성된 소스 코드를 보게 되므로
컴파일러가 표시하는 에러 메시지를 소스 코드에서 즉시 확인하기 힘들다.
=================================
보충
=================================
* 매크로 함수 (define function)
1) 개요
- 전달받는 인수에 따라 서로 다른 결과를 갖도록 치환하며, 함수처럼 사용할 수 있다.
2) 사용 방법
# define [매크로 함수명(인수)] [치환될 부분]
-> 매크로명 뒤에 괄호를 열고 인수를 나열한다.
3) 사용 상의 주의점
- 치환된 후의 부작용을 줄이기 위해서 치환될 부분에 괄호를 써서 정의한다
[예시1]
#define MUL(a,b) a * b
result = 30 / MUL(2,5)
전처리 후 -> result = 30 / 2 * 5;
해설) 전처리가 끝나고 치환된 코드에서 연산 순서가 뒤바뀜
때문에 값이 3이 아니라 75가 됨
[예시1]
#define MUL(a,b) (a * b)
result = 30 / MUL(2,2+3)
전처리 후 -> result = 30 / (2 * 2 + 3);
해설 ) 곱셈을 먼저 수행하여 7이 계산되고,
이후 30을 7로 나눈 몫 4가 최종 값이 된다.
결국 부작용을 최소화하기 위해 치환될 부분을 구성하는
모든 인수에 괄호를 적용하는 것이 그나마 오류를 최소화하는 방법
4) 장점
- 호출한 함수로 이동할 때 필요한 준비작업이 없다.
- 상대적으로 실행 속도가 빠르다.
- 크기가 작은 함수를 자주 호출한다면 매크로 함수가 좋은 대안.
5) 단점
- 함수처럼 쓰이는 전처리 지시자이지만 치환된 후 발생할 문제를 예측하기 어렵다
많은 기능을 매크로 함수로 구현하기는 힘들고, 수정하기도 쉬운 일이 아니다.
4. 매크로 연산자 #과 ##(define operator)
1) 정의
- 매크로 함수의 치환될 부분에서 사용하는 연산자
2) 종류
(1) # : 인수를 문자열로 치환
(2) ## : 2개의 토큰(token)을 붙여서 하나로 만드는 연산
※ 토큰 : 프로그램에서 독립된 의미를 갖는 하나의 단위
'C++' 카테고리의 다른 글
C++ 소소한 에러 / 콘솔창 / SDK 버전 (0) | 2021.08.16 |
---|---|
C++ 조건부 컴파일 (0) | 2021.08.16 |
C++ STL (0) | 2021.08.14 |
C++ PlaySound (0) | 2021.08.14 |
C++ 클래스와 정보은닉 (0) | 2021.08.12 |