설명에 들어가기 전 후기

42 Seoul 본과정에 들어가서 처음으로 하는 과제였다.

첫 과제인 만큼 피신 때와 과제 유형은 굉장히 비슷했다.

어렵지는 않았지만 함수 수가 굉장히 많아서 까먹고 빠뜨리는 함수도 있었다.

피신 후반, 러쉬때에 간단하게 작성했던 makefile을 본격적으로 작성하게 되고, bonus까지 고려하여 makefile을 작성해야 했기에 피신 때 공부했던 내용들에서 조금 더 공부를 하게 되었다.

makefile의 make relink 방지법을 배우며 makefile은 위에서부터 순차적으로 작동함을 알게 되고, 따라서 코드의 순서만 바꾸어도 relink가 방지됨을 알 수 있었다.

 

 

프로젝트 소개

나만의 라이브러리 만들기

 

Part 1

 man에 정의되어 있는 그대로 libc 함수 구현

isalpha. isdigit, isalnum, isascii, isprint, strlen, memset, bzero, memcpy, memmove, strlcpy, strlcat, strncmp, toupper, tolower, strchr, strrchr, memchr, memcmp, strnstr, atoi, calloc, strdup

 

Part 2

libc에 포함되어 있지 않거나 다른 형식으로 포함된 함수 재구현

ft_substr, ft_strjoin, ft_strtrim, ft_split, ft_itoa, ft_strmapi, ft_striteri, ft_putchar_fd, ft_putstr_fd, ft_putendl_fd, ft_putnbr_fd

 

Bonus

연결리스트를 사용한 함수 구현

ft_lstnew, ft_lstadd_front, ft_lstsize, ft_lstlast, ft_lstadd_back, ft_lstdelone, ft_lstclear, ft_lstiter, ft_lstmap

 

 

Makefile

test : main.o
	gcc -o test main.o

main.o : main.c
	gcc -c main.c

 

목적 파일(target) : 원하는 변수명을 설정 가능 (ex. test, main.o)

의존성(Dependency) : 목적 파일을 만들기 위해 필요한 재료

명령어(command) : Tab을 이용하여 작성, 실행할 명령어

 

all : 파일 간의 종속 관계를 파악하여 makefile에 적힌대로 컴파일러에 명령하여 shell의 명령이 순차적으로 실행되게 함

clean : 현재 디렉토리의 모든 object 파일들을 제거

fclean : 현재 디렉토리의 모든 object 파일과 생성된 NAME 타켓 파일을 제거

re : fclean 후 make all 실행

.PHONY : 같은 이름의 파일과 충돌을 막기 위해 사용

 

내부 명령어

$* : 확장자가 없는 현재의 목표 파일(Target)

$@ : 현재의 목표 파일(Target)

$< : 의존 파일 목록의 첫 번째 파일에 대응

$? : 현재의 목표 파일보다 더 최근에 갱신된 파일 이름

$^ : 현재 모든 필수 조건 파일들

 

 

ar 옵션

obj파일들을 ar 명령어를 통해 라이브러리 파일을 생성

ar -rcs

r : 지정한 아카이브로 모듈(obj 파일) 추가. 새로운 파일이면 추가, 기존 파일이면 치환

c : 아카이브(라이브러리 파일) 생성. 존재하지 않는 아카이브를 작성하는 경우에도 경고 메세지를 출력하지 않음

s : 아카이브 인덱스를 생성 (좀 더 빠르게 생성)

 

 

const 키워드

해당 변수의 값을 변경하지 못하게 상수화하는 키워드

const 키워드의 위치별 의미

상수 포인터

char* const ptr = &a;

포인터 변수를 const하겠다는 의미

선언과 동시에 초기화를 해야함

 

상수에 대한 포인터

const char* ptr = &a

char* ptr을 const 하겠다는 의미

*ptr이 가리키는 값이 상수가 되어서 변경 불가

 

상수에 대한 상수 포인터

const char* const ptr = &a;

주소와 값 모두 const이므로 변경 불가

 

size_t

가장 큰 사이즈를 담을 수 있는 부호 없는 데이터 타입

32비트 운영체제 아래에서는 부호 없는 32비트 정수 (unsigned int),

64비트 운영체제 아래에서는 부호 없는 64비트 정수 (unsigned long long)의 고정된 사이즈를 가짐

 

size_t와 달리 unsigned int는 64비트 운영체제 아래에서 꼭 64비트 사이즈를 가진다고 보장할 수 없기에, 컴파일 하는 시스템마다 변수의 크기가 달라질 수 있음

따라서 고정된 사이즈인 size_t를 사용

또한 메모리나 문자열 길이를 구할 때도 size_t 사용 

 

 

unsigned char

메모리 주소값을 처리하기 위해서는 unsigned char을 사용하는 것이 관례

포인터는 주소값이므로 부호를 쓰지 않기에 unsigned를 사용

 

 

void 포인터

c언어에서는 자료형이 다른 포인터끼리 메모리 주소를 저장하면 컴파일 경고가 발생하기에 void 포인터를 사용하여 다양한 자료형의 포인터를 저장할 수 있도록 함

 

파일 디스크립터

리눅스, 유닉스 환경에서 사용되는 개념으로 파일에 접근할 때 사용하는 추상적인 값

 

일반적으로 0이 아닌 정수값 사용

-1 : 실패

0 : 표준 입력

1 : 표준 출력

2 : 표준 에러 출력

3 ~ : open 함수를 통해 열면 3부터 순차적으로 할당 

'42 Seoul' 카테고리의 다른 글

[42 Seoul] Born2beroot - 프로젝트 개요  (0) 2022.09.01
[42 Seoul] ft_printf  (0) 2022.08.19
[42 Seoul] Libft - Bonus  (0) 2022.08.02
[42 Seoul] Libft - Part 2  (0) 2022.08.02
[42 Seoul] Libft - Part 1  (0) 2022.08.02
복사했습니다!