이번글은 제가 Effective C++ 항목 24 부분을 공부한 내용과 컴파일 과정,(전처리, 어셈블리, 링킹), header gouard 에 대한 정리 글입니다.
컴파일 과정
먼저 C++ 의 컴파일 과정은
1. #include, #define과 같은 전처리기 메크로를 처리하는 Preprocessing 단계 (전처리 단계)
2. source code를 Assembly 명령어로 변환하는 compile단계.
3. Assembly 코드들을 실제 기계어로 이루어진 목적 코드(Object file)로 변환하는 어셈블 단계
4. 목적 코드들을 한데 모아서 하나의 실행파일로 만들어주는 Linking단계로 나누어 볼 수 있습니다.
이후 1~4를 수행하고 나면 실행파일이 나오게 됩니다.
(윈도우 계열에서는 Portable Executable, PE형식의 파일을 생성(.exe), Linux의 경우 Executable and Linkable Format, ELF 형태의 실행파일 생성)
namespace 역할과 #include
저희가 항상 사용하는 using namespace std;라는 구문을 .cpp파일 위에다 적어 주게되는데요,
이는 C++ 표준 라이브러리 들이 정의되어있는 namespace를 사용하기 위해 (std namespace 를 편하게 사용하기 위해) 적어주는 코드입니다.
std namespace를 현재 scope에 가져오게 됩니다.
이는 단순히 std에 속한 "식별자"들을 현재 scope에 가져오는 역할을 합니다.
// main.cpp
using namespace std;
int main()
{
std::vector<int> v;
return 0;
}
그래서 위와 같은 코드는 컴파일 에러가 납니다.
이유는 당연히 std에는 vector에 대한 정의는 없고 (std라는 namespace안에 vector라는) "식별자"들만 정의되어 있기 때문에 vector의 정의 부분도 없이 어떻게 무슨 자료형인줄 알고 객체를 컴파일러가 생성할 수 있을 까요? (저는 이런식으로 이해했습니다)
따라서 std::vector 클래스의 정의와 관련된 내용이 필요합니다.
이를 #include <vector>를 통해서 std::vector의 식별자에 대한 정의 부분을 "복사 붙여넣기"를 main.cpp 에다가 해줍니다.
이렇게 되면 std를 적어줄 필요 없이 vector<int> v; 와 같이 사용이 가능합니다.
Header Guard
실제로 #include <iostream>을 하게 될 경우 약 27000줄 이상의 코드가 main.cpp에 그대로 복사 붙여넣기가 됩니다.
이렇게 긴 헤더파일을 중복으로 #include를 막아주는 부분이 "header guard"입니다.
요즘은 #pragama once를 사용하지만 모든 컴파일러가 지원하는 전처리기는 아니기에
#ifndef ~ #endif를 사용하는게 권장됩니다.
컴파일 의존성
이처럼 C++ 라이브러리들이 "이런 구성"으로 되어 있습니다.
"이런 구성"이란 프로그래머가 vector만 필요한 프로그래머(사용자)는 굳이 <memory>, <list>등을 #include 할 필요가 없습니다.
따라서 사용자(프로그래머)는 실제로 사용하는(vector) 구성요소에 대해서만 "컴파일 의존성"을 고려할 수 있게 됩니다.
("이런 구성"이 방금 위에서 말한 부분입니다.)
위의 글은 https://modoocode.com/319를 참고하고 Effective C++ 항목24를 정리한 글입니다.
틀린 부분이 있다면 알려주시면 감사하겠습니다 :)
'CPP' 카테고리의 다른 글
[C++] 전달참조 (0) | 2023.07.31 |
---|---|
[C++] 오른값 참조 (0) | 2023.07.30 |
[C++] Effective C++ 항목 1~27 정리 (0) | 2023.07.03 |
[C++] vftable (0) | 2023.04.21 |
[C++] 복사 생성자와 임시객체 (0) | 2023.04.16 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!