#include <iostream>
//#define은 전처리기이다.
//#define 이름 코드
//코드에서 원하는 부분에 #define의 이름을 넣어주면
//이름 뒤에 있는 코드를 *컴파일 전*에 그곳에 붙여넣어주고
//해당 코드로 컴파일을 진행해 준다.
//대신 #define은 한줄로 작성해야 된다.
#define COUNT 30
//이걸 보고 상수라고 생각할 수 있지만,
//정확히는 상수가 아니다.
#define OUTPUTTEXT std::cout << "define outputtext" << std::endl;
//이렇게 코드를 넣어놓고 나중에 한 단어로 실행을 할 수도 있다.
//상수이면 이렇게 실행되지 않았을 것이다.
//CF)define은 값을 '복사'해주는 기능이다.
#define PRINT(string) std::cout << string << std::endl;
//만약 나중에 PRINT("안녕하세요") 매크로를 호출하면,
//컴파일 전 단계에서 해당 문구를
//std::cout << "안녕하세요" << std::endl;
//로 바꿔주는 형태인 것이다.
//define의 단점
//1. 가독성이 떨어진다
//2. 제일 치명적인 단점 - 디버깅이 불가능하다.
#define TESTF(Number) std::cout << "define에서 함수 호출 : "<<Number << std::endl;
//몇몇 실제 게임들에서 매크로를 길게 썼다가 디버깅이 불가능해서 시간을 들여 갈아엎었던 적이 있다.
int Add(int N1, int N2) { return N1 + N2; }
//이렇게 함수를 한 줄로 짜는 것도 디버깅이 안 되므로 절대로 이렇게 짜지 말것.
//실무에서도 좋지 않게 본다.
//최악의 코드
//결론: define은 정말 확실하게 검증된 함수를 편하게 사용하기 위한 용도로만 사용할 것.
//여기저기서 define을 사용하면 절대 안된다.
int main()
{
std::cout << COUNT << std::endl;
OUTPUTTEXT;
TESTF(5);
return 0;
}