C++/[책 정리] 명품 C++ 프로그래밍

5. #include <iostream>에 숨은 진실

smile blog 2023. 3. 10. 17:32
Reference :
명품 C++ 프로그래밍 / 황기태 / 생능출판사
#include <iostream>와 전처리기

C/C++ 컴파일러는 컴파일 전에 우선 전처리기 (preprocessor)를 실행시켜 #include문을 모두 처리한다

 

헤더 파일의 확장

  • 전처리기가 #include 문에 지정된 <헤더 파일>의 텍스트를 #include 문이 있던 그 자리에 삽입하는 것
  • <헤더파일> 내에 또 다른 include 하는 문이 내포되어 있으면, 다시 그 자리에 '헤더 파일의 확장'이 일어나고, 모든 '헤더 파일의 확장'이 완료되면 전처리기는 종료

  1. <iostream> 파일은 <istream> 파일을 include
  2. <istream> 파일은 <ostream> 파일을 include
  3. <ostream> 파일은 <ios> 파일을 include 하므로
  4. include 한 모든 헤더 파일이 모두 SimpleC++.cpp 소스 파일 내에 확장되어 들어오게 된다.

<iostream> 헤더 파일은 어디에?

<iostream> 헤더 파일은 텍스트 파일로서 컴파일러가 설치된 폴더의 include 폴더에 존재


표준 C++ 헤더 파일은 확장자가 없다.

C언어에서 C 표준 라이브러리 헤더 파일의 확장자는 .h이다

C++에서도 C++ 표준 라이브러리 헤더 파일 확장자를 .h로 사용하여 오다가 2003년 C++ 표준부터 헤더 파일에 확장자를 붙이지 않기로 했다


#include <헤더 파일>과 #include "헤더 파일"의 차이

- #include <헤더파일>

: 컴파일러가 설치된 폴더에서 "헤더 파일"을 찾으라는 지시

ex) #include <iostream>

 

- #include "헤더파일"

: 개발자의 프로젝트 폴더나 개발자가 컴파일 옵션으로 지정한 include 폴더에서 '헤더 파일'을 찾도록 지시


헤더 파일에는 무엇이 들어 있는가?

흔한 오답

: strcpy() 함수를 사용하려면 <cstring>을 include 하는데, 그 이유는 strcpy() 함수의 코드가 들어 있기 때문이다

 

정답

  • strcpy() 함수의 코드는 이미 컴파일된 기계어 형태로 C 라이브러리에 들어 있다
  • 실행 중에 strcpy()가 호출되면 C 라이브러리의 코드를 호출하지, <cstring> 헤더 파일에 있는 무언가를 호출하는 것이 아니다.
  • <cstring> 헤더 파일에는 strcpy() 함수의 선언만(원형) 들어 있으며, 컴파일할 때 strcpy() 함수의 호출이 정확한지 판단하는데 사용된다.

간단하게 보면 =>

<cstring>

strcpy();	//함수 원형만 존재
<stdio.h>

void strcpy()	//내용물은 라이브러리에 있음
{
	.....
}

cout과 cin은 어디에 선언되어 있는가?
  • cout이나 cin은 모두 <iostream> 헤더 파일에 선언된 객체들
  • cin은 istream 타입, cout은 ostream 타입의 객체로 선언된 것을 볼 수 있음