목록2025/04/14 (5)
나만의 작은 도서관

개요컴파일러는 컴파일 단계에서 소스 코드를 목적 코드(예: .obj, .o 파일)로 변환하여, 이후 단계인 링커 단계에서 링커가 사용할 수 있도록 한다. 이 목적 코드에는 크게 두 가지 핵심 요소가 포함되는데, 첫 번째 요소로는 실행 가능한 기계어 수준의 “명령어”, 두 번째 요소로는 링커가 코드 조각들을 연결할 때 참조하는 “심볼 테이블”이다. 이 중 심볼 테이블은 외부 또는 내부 심볼을 식별하고 연결하는 데 필요한 정보를 담고 있으며, 이를 이해하려면 먼저 심볼(symbol)이라는 개념을 정확히 파악할 필요가 있다. 따라서, 이 글에서는 심볼이 무엇인지, 그리고 어떤 종류의 심볼이 존재하는지 살펴본다. 이어서, 컴파일러가 심볼을 심볼 테이블에 추가할 때 사용하는 저장 방식 지정자(storage cla..

개요컴파일 단계는 프로그래밍 언어로 된 코드를 기계어로 변환하는 과정이다. 이 과정을 수행하는 컴파일러는 ODR(One Definition Rule, 유일 정의 규칙)이라는 정해진 규칙을 준수하는데, 이러한 ODR을 이해하기 위해 필요한 개념이 바로 번역 단위와 선언과 정의이다.이 글에서는 컴파일 과정에서 준수하는 ODR이라는 규칙을 이해하기 위해 번역 단위가 무엇인지, 선언과 정의가 어떻게 구분되는지, 그리고 마지막으로 ODR 정의에 대한 해석을 간단하게 다룬다.번역 단위(translation unit)번역 단위(이하 TU)란 하나의 소스 파일(.cpp)이 전처리 단계를 거친 후에 생긴 결과물을 의미하며, 컴파일러가 소스 파일(.cpp)을 처리하는 단위이다.즉, TU는 #include, #define과..

#pragma 지시문#pragma 지시문은 C/C++ 표준 키워드가 아닌 컴파일러에 종속된 키워드들로, 컴파일러의 종류에 따라 기능이나 문법이 다르다.#pragma는 #include나 #define처럼 전처리기에 의해 처리되지만, 전처리기는 이를 단순히 해석하여 컴파일러에게 전달하고, 실제 동작은 컴파일러가 수행한다.이러한 #pragma를 활용하면 코드의 경고 제어, 최적화 설정, 메모리 정렬, 헤더 중복 방지 등 다양한 작업을 수행할 수 있다.대표적인 #pragma 지시문들#pragma once#pragma pack#pragma region#pragma comment#pragma once#pragma once#pragma once는 헤더 파일이 동일한 번역 단위(translation unit, TU) ..

전처리기 지시문(preprocessor directive)이란?전처리기 지시문은 전처리 단계에서 전처리기(preprocessor)에 의해 처리되는 명령어로, 명령어들은 모두 ‘#’ 기호로 시작한다.전처리기 지시문을 활용하면 파일 포함, 조건부 컴파일, 매크로 정의 등 다양한 작업을 수행할 수 있다.대표적인 전처리기 명령어#include#define#ifdef, #ifndef#include#include "path-spec" // 사용자 정의 파일 추가 방식#include // 표준 라이브러리 추가 방식#include는 전처리기 지시문 중에서도 가장 자주 사용되는 명령어로, 지정한 파일을 현재 소스 파일에 추가한다. #include가 파일을 추가하는 방식#include가 실행되면 지정한 파일의 모든 내..

빌드(Build)란?빌드란 프로그래밍 언어로 작성된 코드를 실행 가능한 프로그램으로 만드는 전체 과정을 의미한다.C++에서의 빌드는 헤더 파일(.h)이나 소스 파일(.cpp) 등에 작성된 코드들을 하나의 실행 파일(.exe과 같은)로 변환하는 과정이다. C++ 빌드의 각 단계 (4단계)C++에서 빌드는 크게 4가지 단계로 구성되며, 각 단계는 아래와 같다.전처리(Preprocessing) 단계: #include나 #define같은 전처리 지시어들을 처리한다.컴파일(Compile) 단계: 각각의 소스 파일(.cpp)의 코드들을 어셈블리 코드로 변환한다. (file.cpp → file.s)어셈블(Assemble) 단계: 어셈블리 코드들을 실제 기계어로 이루어진 목적 코드로 변환한다. (file.s → fil..