Coding/Unreal, C++

[C++ Primer Plus] 2. Setting Out to C++

출처: C++ Primer Plus 6th Chapter 2

대답해야 하는 질문들

  1. Function Header는 어떤 정보를 담고 있나요?
  2. #include는 빌드에서 어떻게 작동하나요? 
  3. Namespace는 왜 사용하나요?

The Function Header

  • Funtion Header는 해당 함수를 호출하기 위한 인터페이스를 알려준다.
  • Return Type은 Called function이 끝나서 Calling function으로 돌아갈 때, 어떤 정보가 들어오는 지 알려준다.
  • argument list 또는 parameter list는 Calling funtion에서 Called function으로의 정보 흐름을 알려준다.

void main()

  • main 함수를 선언하는 여러 방법이 있다.
main() // original C style
int main()
int main(void) // very explicit style
void main() // lazy = not compatible all OS
  • 여기서 4번째 경우인, void main()을 살펴보자. 처음에 C++을 배울 때, 쓰게 되는 방식이다. 왜냐하면 main이 int를 리턴한다는데, 그 필요성도 공감할 수 없고 void를 해도 잘 돌아가니까 이게 더 예뻐보이기 때문이다.
  • 하지만 이런 방식은 C++ standard라고 볼 수 없으므로 지양해야 한다. 애초에 다른 OS에서는 실패할 수 있다.
  • 또한 int main(void)는 가장 explicit한 표기방법으로 여기서 void는 argument가 들어오지 않는다는 것을 의미한다. 
  • int main()이지만 return 0;을 안넣어도 잘 되는데, 이런 것을 implicit return이라고 부르며 이는 c++ standard가 지원하는 기능이다. 단, main에서만 작동한다.

Why main() by Any Other Name Is Not the Same

  • 프로그램을 빌드할 때, main 함수가 없으면 컴파일 단계에서 에러가 뜨는 것을 볼 수 있다.
  • 왜냐하면 C++ Program이 실행되면, (따로 설정을 해주지않는 한) 무조건 main에서 시작하기 때문이다. 즉, main()이 없으면 완전한 프로그램이 될 수 없다.
  • 여기엔 예외가 있는데, DLL(Dynamic Link Library)이 그것이다. DLL은 스탠드얼론 프로그램이 아니라 다른 프로그램에서 쓰이기 위한 코드이므로 main이 없다.
  • 특정 프로그래밍 환경에서는 _tmain()과 같은 방식의 main을 작성해야 할 수 있는데, 이 경우엔 main()문이 숨겨져있고 숨겨진 main()문에서 _tmain()을 호출한다. 

The C++ Preprocesor and the iostream File

  • C++은 (C와 마찬가지로) preprocessor를 가지고 있다.
  • preprocessor는 소스 코드를 컴파일 단계 이전에 재구성한다.
  • # 로 시작하는 코드가 전처리에 처리되는 directive(지시어)다.
  • #include <iostream>은 preprocessor가 iostream의 내용을 여기에다 추가하도록 한다.
  • preprocessor의 가장 전형적인 행동이 텍스트를 추가하거나 대체하는 것이다.

Namespaces

  • using namespace std; 에서 using이 지시어다.
  • Namespace는 큰 프로그램을 만들 때, 기존 코드를 가져다 사용할 텐데 이때에 다양한 vendors의 코드를 컴파일러에게 혼동없이 가져오기 위해 존재한다.
  • using namespace std;는 해당 namespace를 생략해서 쓰겠다는 의미다.

Declaration Statements and Variables

int carrots;
  • 함수를 정의하는 이 짧은 코드는 2가지 정보를 담는다.
    1. 메모리 저장소의 타입(ex. int)
    2. 저장된 메모리 지점의 라벨(ex. carrots)

A New Trick for cout

cout << carrots;
  • 간단해 보이는 코드이지만 2단계에 걸친 트릭이 있다.
    1. cout가 carrots의 현재 숫자 값을 가져온다.
    2. 가져온 숫자 값을 적절한 문자열로 치환해서 출력한다.
  • 여기서 가장 주목해야할 점은 cout이 자기가 쓰는 데이터의 타입을 알 정도로 똑똑하다는 점이다.