#include <iostream>
/** 문자열 관련 라이브러리*/
#include <string>
/** C++ 표준 라이브러리 사용합니다. */
using namespace std;
/** 매크로 상수를 정의합니다. 끝에 문장의 끝을 나타내는 ;(세미콜론)이 없습니다. */
#define PI 3.141592
#define MY_NAME "John"
#define YEAR 2023
#define MONTH "April"
#define DAY 25
/**
#define을 이용하여 상수뿐만이 아니고 함수도 정의할 수 있습니다.
이름 매크로 함수라고 합니다.
*/
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a > b) ? a : b)
/**
#undef
#undef는 #define과 반대라고 생각하면 됩니다.
#define으로 정의한 내용을 #undef을 사용하면 정의된 것이 없었던 일로 됩니다.
정의해 주도록 합니다.
*/
#define WIDTH 98
#define ADD(X, Y) ((X) + (Y))
#undef WIDTH
#undef ADD
int main()
{
/**
C++ 에서 컴파일되는 과정은 다음과 같습니다.
1. 프로그래머가 작성한 소스파일은 가장 먼저 소스파일에 대한ㅇ 처리는 하는
선행 처리기를 거치고
2. 컴파일되어서 오브젝트 파일이 생성되고
3. 다시 링커에 의해서 실행파일이 됩니다.
여기서 전처리이자 선행처리(Preprocess)란?
컴파일 하기 전, 소스 파일 내에 존재하는 선행 처리 지시문을 처리하는 과정을 의미합니다.
선행 처리 지시문에는 #include, #define, #undef, #if, #elif, #else등
*/
/**
#include
특정 프로그램 파일을 현재 위치에 첨부하여, 하나의 파일처럼 사용합니다.
#include <stdio.h> Standard Input Output C언어에서 제공하는 헤더파일
#include <iostream> Input Output Stream C++ 언어에서 제공하는 헤더파일
#include "Creature.h" 우리가 정의한 커스텀 헤더파일
<iostream> : C++에서 가장 많이 사용하는 헤더파일, 기본 입출력에 관한 기능으 포함합니다.
<string> : 문자열 타임인 std::string과 관련 함수를 포함하는 헤더파일입니다.
<chrono> : 시간 관련 헤더파일입니다.
<filesystem> : 파일 시스템 관련 헤더파일입니다.
<thread> : 쓰레드 관련 헤더파일입니다.
<iomanip> : 입출력 조정자에 관한 헤더파일입니다.
<fstream> : 파일 스트림 관련 헤더파일입니다.
<sstream> : std::stringstream이 있는 헤더파일입니다.
<vector> : vector이 있는 헤더파일
C++에서 제공하는 헤더파일에 확장자가 없는 이유는
C++에서 표준 헤더 파일의 선언은 확장자를 생략하기로 약속이 되어 있기 때문입니다.
*/
/**
#define 특별히 매크로라고 합니다.
상수를 이름으로 정의하거나 매크로 함수를 정의할 때 사용하는 전처리 문입니다.
#define을 잘 활용하면 가독성을 높일 수 이?ㅆ습니다.
#define으로 상수를 선언하는 것을 매크로라고 하는데, 선언하는 방법은 다음과 같습니다.
#define PI 3.141592
그리고 실제로 사용할 때는 PI라는 이름으로 사용하면 됩니다.
선행 처리자가 #define문을 인식하고 PI 부분을 3.141592라는 상수값으로 치환합니다.
정의해 주도록 합니다.
*/
/** 문장을 추가해 줍니다. */
cout << "PI : " << PI << endl;
cout << "SQUARE(9) : " << SQUARE(9) << endl;
cout << endl;
/**
매크로 함수를 쓰는 이유는 무엇일까요?
함수와 매크로 함수의 정의 차이는 무엇일까요?
함수는 실행파일의 크기를 줄여주고, 코드이 재사용성을 높여주지만 실행 속도가 늦어지는 단점이 있습니다.
매크로 함수는 실행파일의 크기가 커지고 스택 프레임을 사용할 수 없기 때문에 재귀 호출 구조를 만들 수
없다는 단점은 있지만 실행 속도가 증가하는 장점이 있습니다.
*/
/**
#undef
#undef는 #define과 반대라고 생각하면 됩니다.
#define으로 정의한 내용을 #undef을 사용하면 정의된 것이 없었던 일로 됩니다.
정의해 주도록 합니다.
*/
/** 문장을 추가해 줍니다. */
// cout << "WIDTH : " << WIDTH << endl; // (X)
// int AddResult = ADD(100, 200); // (X)
}