공부를 하는 입장이기 때문에, 내용에 오류가 있을 수 있습니다. 오류가 있다면 적극적으로 알려주시면 감사합니다!
C++의 구조
코드를 작성하고 나면 흔히 컴파일 한다고 한다. 파이썬의 경우 visual studio code같은 개발 환경에서 코드를 작성하고 나면 바로 실행 시켰을 때, 실행이 된다. 하지만 C나 C++의 경우 gcc같은 컴파일러에서 컴파일을 하고 나면 코드가 실행 되는 것이 아닌, 실행 파일이 생성 된다는 것을 알 수 있다. 즉 C++의 경우 우리가 생각하는 컴파일 과정이 사실 조금 나눠져 있다.
이 과정은 크게 세 단계로 나눌 수 있다. 첫째, 소스 코드를 컴파일러가 읽어 기계어로 번역하는 '컴파일' 단계. 둘째, 여러 개의 오브젝트 파일들을 링크하여 하나의 실행파일을 만드는 '링크' 단계. 그리고 마지막으로 만들어진 실행파일을 실제로 실행하는 '실행' 단계가 있다.
Object file, compile
오브젝트 파일의 경우 소스 코드를 어셈블리어 변환기나 컴파일러가 0과 1로 번역해 놓은 파일을 말한다. 컴파일의 경우 한 개의 파일이 컴파일이 진행 된다. 이 말은 즉, 한 개의 파일을 컴파일하여 한 개의 오브젝트 파일을 생성한다는 것을 의미한다. 또한 여러개의 오브젝트 파일을 컴파일 하면 여러 개의 오브젝트 파일이 생성 된다.
Linker
여러 개의 오브젝트 파일이 만들어 지는 것은 이것들을 연결하는 link의 필요성을 느끼게 해준다. 처음 C++을 접했을 때, 이해가 되지 않았던 부분이 이부분이다. 파이썬의 경우 라이브러리를 불러올 경우 가상환경을 만들고 pip를 통해 쉽게 라이브러리를 설치 및 삭제를 할 수 있고 쉽게 import해서 불러올 수 있다. 또한 여러 개의 파일의 경우 같은 트리 단계에 위치하면, 그냥 불러 쓸 수 있고, 하위 폴더에 있는 경우도 적절한 상대 경로를 통하여 import 할수 있다. 하지만 C++의 경우는 linker을 통해서 각각의 오브젝트 파일과 라이브러리를 연결해 주어야 한다.
이렇게 된다면 한 가지 더 떠올릴 수 있는 점이 있다. 우리가 흔히 C언어나 C++언어를 사용하게 된다면 기본적으로 아래와 같은 형식을 띄게 된다.
int main(void){
...
return 0;
}
이는 내가 생각 했었을 때, 파이썬에서 아래와 같은 형식이라고 생각 했었다.
if __name__=="__main__":
pass
파이썬 같은 경우는 저 구문이 실제 실행되는 파일이 아니라면 실행이 되지 않는다. 하지만 C++의 경우 main문이 한 개만 존재해야 한다. 따라서 오브젝트 파일들을 링커로 연결을 진행 하였을 때, 오브젝트 파일들이 메인문들을 갖고 있다면 컴파일 에러가 발생 하게 된다. 이는 프로젝트에서는 별로 문제가 된다고 생각하지는 않지만(대부분의 경우 프로젝트가 한 가지의 메인문에서만 실행 하도록 구조를 짜기 때문에) 배우는 입장에서는 한 폴더에 배우는 코드들이 모두 담겨 있기 때문에 오류가 발생하기 쉽다. 특히 나의 경우 2학년 여름 방학에 잠깐 C++를 공부하면서 한 개의 디렉토리에 모든 예제 코드를 넣어 놓고 vscode에서 컴파일러의 컴파일을 폴더 전체로 해놓았더니 이런 문제가 발생하였다.
따라서 이번 진행은 visual studio로 진행하면서(조금 더 c++개발에 잘되어 있는 환경을 써보고 싶어서)다음 같은 형식으로 진행하려 한다.
이런 식으로 프로젝트마다 폴더를 만들어서 진행 하려고 한다.
visual studio에서는 link중에 dynamic link(<=> static link)을 진행한다고 하는데, 더 이상은 아직 까지는 불필요하다고 생각하여 여기까지만 작성하도록 하겠다.
Header
헤더 파일은 C++ 코드에서 다른 파일에 정의된 함수나 변수를 사용하기 위해 필요하다. 이 파일에는 함수의 프로토타입, 클래스 및 변수 선언 등이 포함되고 이를 통해 C++ 컴파일러는 함수나 변수가 어떤 형태로 존재하는지 알 수 있다. 따라서 보통 한개의 .cpp파일에 .h파일이 따라 붙는다.
헤더 파일의 경우 보통 아래와 같은 형식을 띈다.
#ifndef MATH_H
#define MATH_H
...
#endif
이는 전처리 과정에서 사용되었던 함수 이다. 이런 형식을 Header guard라 한다. 코드를 보면, MATH_H가 정의가 안되어 있다면, endif 구문으로 넘어가고 아니면 정의 한 뒤 코드가 실행 된다. 이때, endif 구문 뒤에는 아무것도 써있지 않아 그냥 끝나게 되고 이를 통해 파일이 한번만 작동되게 한다. 파일이 중복실행되면 컴파일 에러가 발생하기 때문에 이를 막을 수 있고, 여러개의 파일에서 만약 똑같은 파일을 불러와서 중복되는 include가 있다면 메모리가 효율적이지 못할 것이다. 따라서 한번만 진행 되어 메모리를 효율적으로 관리 할 수 있다.
'c++' 카테고리의 다른 글
[c++] Range-based for loop (범위 기반 for 문) (1) | 2024.04.25 |
---|---|
04. C++만의 특징 2 (0) | 2024.01.14 |
03. C언어 복습 (0) | 2024.01.04 |
02. C++만의 특징 1 (0) | 2024.01.03 |
00. 첫글! (0) | 2023.12.26 |