프로그래밍이란 목적에 맞는 알고리즘으로부터 프로그래밍 언어를 사용하여 구체적인 프로그램을 작성하는 과정을 의미한다.
이렇게 작성된 프로그램은 먼저 실행 파일로 변환되어야 실행 할 수 있다.
윗 그림과 같은 순서로 실행까지 도달한다. 여기서, "선행처리기(PreProcessor)", "컴파일러(Compiler)" 이 핵심이 된다.
선행처리(PreProcess)란 소스 파일 내에서도 선행처리 문자(#) 시작하는 선행처리 지시문의 처리 작업을 의미한다.
이러한 선행처리 작업은 선행처리기(PreProcessor)가 수행한다.
선행처리기는 코드를 생성하는 것이 아닌, 일(Compile)하기 전 컴파일러가 작업하기 좋도록 소스를 재구성해주는 역할만을 한다.
선행처리 문자(#)이 소스코드 내에서 사용되는 예시는 다음과 같다.
(한줄이 넘을시에는 행의 끝에 '\'을 넣어 여러줄로 작성한다.)
#include<stdio.h> //표준 디렉토리에서 해당 해더파일을 찾는다. (C에 내장되어 있는 헤더파일을 의미)
#define PI 3.14 // 매크로 상수 사용
// <조건 컴파일> 선택적으로 컴파일
// 조건문이 참이면 컴파일
#if 조건문
#elif 조건문
#else
#endif
// 예제
#define DEBUG 2
#if DEBUG == 1 || DEBUG == 3
...
#elif DEBUG >= 2
...
#else
...
#endif
...
// 매크로 상수가 정의되어 있으면 컴파일
#ifdef 매크로상수
#else
#endif
//예제
#define DEBUG
#ifdef DEBUG
....
#endif
//매크로 상수가 정의되어 있지 않으면 컴파일
#ifndef 매크로상수
#endif
//ETC (조건 컴파일 사이에 같이 사용)
#undef >> 매크로 정의 제거
#line digit "filename" >> 줄 번호 변경 및 파일이름 변경
#pragma >> 컴파일러에게 한번만 컴파일 할 것을 지시
P.S) 표준 매크로 (등록하지 않아도 미리 등록되어있는 매크로 상수)
1. FILE: 현재 소스 코드의 파일명을 나타내는 문자열
2. DATE: 컴파일 날짜를 "월 일 년" 형태로 나타내는 문자열
3. TIME: 컴파일 시각을 "시:분:초" 형태로 나타내는 문자열
4. LINE: 현재 처리중인 소스파일의 행 번호
5. TIMESTAMP: 소스 파일의 최종 변경 날짜와 시간
P.S 2) #과 ##연산자
1. 전달인자의 문자화 ( # 연산자 >> 매크로에서 문자열로 변환 시켜줌)
#define ADD(x,y) printf(#x"+"#y"=%d\n", x+y)
2. 문자열 결합 ( 두 개의 토큰을 이어준다. 혹은 붙여준다. )
#define Print(x) Print ## x
기계, 즉, 컴퓨터는 0과 1로 이루어진 이진수로 작성된 기계어만을 이해 할 수 있다. 소스 파일은 C언어로 작성되므로, 작성된 C언어를 기계어로 번역을 해줘야 기계가 뜻을 이해하게 되는데 이러한 번역 활동을
컴파일(Compile)이라고 한다.
컴파일은 컴파일러(Compiler) 의해 수행되며, 컴파일이 끝나 기계어로 변환된 파일을 오브젝트 파일(Object File) 이라고 한다. 이러한 오브젝트 파일의 확장자는 .o나 .obj가 된다.
컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 시동 코드(Start-up Code)를 가지고 있지 않다.
또한, 대부분의 C프로그램에서 사용하는 C 푶준 라이브러리 파일도 포함되어 있지 않기 때문에, 링커가 필요하다.
하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을 링크(Link) 라고 한다.
링크는 링커(Linker) 에 의해 수행되며, 링크가 끝나야 하나의 새로운 실행파일이나 라이브러리 파일이 생성되게 된다.