먼저 C 코드 를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 컴파일(compile) 이라는 과정이 진행됩니다. 이는 단일소스코드전체를어셈블리어(기계어와1: 1대응이되어있음)로변환해줍니다(이때, 목적코드라 불리는 확장자가 .o 인 파일이 생성됩니다). 이 과정이 끝나게 되면 링킹(linking) 이라는 과정이 진행되는데 말그대로 각기 다른 파일에 위치한 소스 코드들을 한데 엮어서 하나의 실행 파일로 만들어지는 과정이라 생각하시면 됩니다.
링킹 과정에서 특정한 소스 파일에 있는 함수들이 어디어디에 있는지 찾는 과정을 거치게 되는데 예를 들어서 test.c 의 경우 compare 함수가 어디있는지 찾게 됩니다. (눈치가 빠른 독자라면 printf 함수 역시 찾아야 함을 알 수 있는데 이에 대한 설명은 나중에 하겠습니다)
우리의 예제의 경우 compare 함수는 str.c 에 있기 때문에 링커(링킹을 해주는 프로그램) 는 ’test.c 에서 compare 함수를 호출하는 경우 str.c 에서 찾아라’ 정도로 처리해 주게 됩니다. 덕 분에 우리는 test.c 에서 compare 함수를 호출하더라도 str.c 의 compare 함수를 이용할 수 있게 되는 것이지요.
#include 와 같은 명령들은 전처리기(Preprocessor) 명령이라고 부르는데 이러한 명령들의 특 징은 컴파일 이전에 실행된다는 점 입니다.이 명령은 우리가 지칭하는 파일의 내용을 정확히 100% 복사해서 붙여 넣는다는 점입니다. 따라서 #include "str.h" 라는 명령은 str.h 에 있었던 내용, 즉 char compare(char *str1, char *str2); 로 컴파일이 시작하기 전에 바뀌어
버립니다.
그렇다면 #include <stdio.h> 는 어떨까요? 이 역시 똑같습니다. stdio.h 에 써있는 내용들 이 정확히 복사되어 컴파일 이전에 코드에 붙어버립니다. 그런데 한 가지 이상한 점은 stdio.h 는 <>로감쌌는데,str.h는왜" "로감쌌을까요? 그이유는단순한데,< >로감싸는헤더파일은 컴파일러에서 기본으로 지원하는 헤더파일의 경우이고 " " 로 감싸는 헤더파일은 사용자가 직접 제작한 헤더파일의 경우 입니다.
여러분은 stdio.h 에 무엇이 써져 있는지 궁금하지 않으세요? 한 번 제가 그 내용을 올려드리겠 습니다. 참고로 여기에서 전체 코드를 보실 수 있습니다.
https://code.woboq.org/userspace/glibc/libio/stdio.h.html
#include 라는 명령에 대해 알아보았습니다. 이렇게 # 이 들어간 명령들은 ’전 처리기 명령’ 이라고 하는데 전처리기의 의미는 컴파일 이전에 처리된다는 뜻 입니다. 즉, 컴파일이 되기 이전에 #include 라는 부분은 #include 에 해당하는 파일의 소스 코드로 정확히 바뀝니다
#include 말고도 # 이 들어가 있는 엄청나게 많은 수의 명령들을 볼 수 있었습니다.
예를 들면 #define, #ifdef 등등 이죠. 이번에는 이러한 다양한 종류의 전처리기 명령들에 대해 알아보도록 합시다.
'컴퓨터 시스템 > CSAPP' 카테고리의 다른 글
[ CSAPP / ch11 ] tiny web server, web proxy (0) | 2021.09.27 |
---|---|
C 입력 버퍼와 출력 버퍼 stdin, stdout (0) | 2021.09.24 |
웹 서버 기본 개념 정리(네트워크, TCP/IP , 소켓 프로그래밍) -작성중 (1) | 2021.09.20 |
동적 메모리 할당(Dynamic memory allocation), malloc 함수 구현 (malloc lab) (0) | 2021.09.14 |
데이터 세그먼트 간단정리 (0) | 2021.09.06 |