필요 개념
1. char 와 unsigned char
- 임의의 메모리를 1바이트로 쪼개서 다룰 때에는 char보다 모든 비트가 value bit 인 unsigned char로 형 변환하여 다루는 것이 좋다.
2. 정수 자료형
- 비트값을 있는 그대로 가지는 자료형이 정수형(Integer type)이다.
- 정수 타입은 기본적으로 char, int, short, long, long long
- char - 8비트, short - 16비트, long - 32비트, long long - 64비트
- int 는 32bit 운영체제에서는 4바이트, 64bit 운영체제에서는 8바이트라고 알고있었는데,
Intel CPU에서는 무조건 4바이트라고 한다. (32bit에서 64bit로 갈때 모든 프로그램을 수정해야할 수 있기 때문에..) - 포인터의 크기는 컴파일러가 결정한다.
64bit의 운영체제에서 32bit로 컴파일 시 4바이트, 64bit의 운영체제에서 64bit로 컴파일 시 포인터변수의 크기가 8바이트로 나타난다.
3. size_t
- size_t 는 가장 큰 사이즈를 담을 수 있는 "unsigned 데이터 타입”
- 32bit 머신에서는 32bit로 표현 가능한 가장 큰 정수형 = unsigned int
- 64bit 머신에서는 = unsigned long long
4. Makefile
(1) 컴파일(Compile)
- 소스 코드를 컴퓨터가 이해할 수 있는 어셈블리어로 변환하는 과정
- -c 옵션 : 링크를 하지 않고 컴파일해서 목적 파일(Object File)을 생성하라는 의미
- -o 옵션 : 생성된 아웃풋 파일의 이름을 지정하는 옵션
(2) 링크(Link)
- 서로 다른 파일에 흩어져 있던 함수나 클래스들을 한 데 묶어서 링크해주는 작업
- main 함수 안에 cat 함수와 bee 함수가 어디에 정의되어 있는지 위치를 찾고 제대로 함수를 호출할 수 있게 된다
(3) makefile
(타겟) : (재료1) (재료2) (재료3)
(터미널 명령어)
- make (타겟) 을 실행하면 타겟 이름으로 파일이 만들어진다.
- Makefile이 위치해 있고 실행되는 작업 디렉토리 내에 해당 이름의 파일이 존재하면, make가 이미 빌드가 끝난 타겟이라고 판단해서 명령어를 수행하지 않는다.
- .PHONY 로 정의해 두면 실제로 폴더 내의 파일로 빌드가 되었는지 여부를 고려하지 않고 수행한다.
SRCS = ft_isalpha.c \\
ft_isdigit.c \\
...
OBJS = $(SRCS:.c=.o)
CC = gcc
RM = rm -f
AR = ar crs
CFLAGS = -Wall -Wextra -Werror
NAME = libft.a
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
all: $(NAME)
clean:
$(RM) $(OBJS)
fclean: clean
$(RM) $(NAME)
re:
$(MAKE) fclean
$(MAKE) all
$(NAME): $(OBJS)
$(AR) $@ $^
.PHONY: all clean fclean re
- <SRCS> : .c파일들의 모음. 공백으로 구분하여 여러개의 파일들을 매크로로 등록한다.
- <OBJS> : .o파일들의 모음. SRCS매크로에 지정된 것들을 불러오되 모든 .c부분을 .o로 바꿔서 불러온다.
- <%.o : %.c> : 타겟 ft_split.o 가 필요하다면 ft_split.c 재료를 찾아서 아래 명령어를 수행
gcc -Wall -Wextra -Werror -c ft_strlen.c -o ft_strlen.o
- $< : 첫재료, $@ : 타겟, % : 동일한이름으로 매칭, $^ : 타겟 전체
- <re> : &(MAKE) 는 재귀적으로 make 명령문을 써야할 때, 현재 디렉토리에 있는 make 명령문을 가져온다. 아래 명령문을 실행하는 효과이다.
make fclean
make all
코드
https://github.com/cat2998/42Seoul/tree/master/00_libft
GitHub - cat2998/42Seoul
Contribute to cat2998/42Seoul development by creating an account on GitHub.
github.com