ARFLAGS
는 프로그램의 매개변수로 사용자가 따로 정의하지 않을 시 기본값으로 rv
를 가진다
Makefile
작성 과정에서$(AR) = ar src
로 정의하고$(AR)
$(ARFLAG)
를 사용해서 rv파일이 나온 것.
$(addprefix prefix, string)
의 형태로 사용한다.$(addsuffix suffix, string)
의 형태로 사용한다.-C
옵션은 디렉토리 이동 옵션으로, make -C dir
의 형태로 사용한다. gcc (실행파일) -L(디렉토리) -l(파일 이름)
gcc main.c -L. -lftprintf
lib
와 .a
를 빼고 인식한다.⚠️ 공백 없이 이어쓰기⚠️
printf
, scanf
와 같이 매개변수의 개수가 정해져있지 않은 함수가 존재한다. 이렇게 매번 개수가 바뀌는 매개변수를 가변인자
라고 한다....
를 작성하여 매개변수의 개수가 정해지지 않았다는 표시를 한다.// 반환값자료형 함수이름(자료형 고정매개변수, ...)의 형태
int printf(const char *format, ...)
⚠️
...
뒤에는 다른 매개변수를 지정할 수 없다 ⚠️
stdarg.h
에 정의되어 있다. va_list ap;
va_list
형의 포인터 변수를 이용한다. 관습적으로 ap
라는 이름을 사용한다.가변인자의 첫 번째 인수를 가리키도록 초기화한다.
va_start(ap, format);
va_list 인스턴스(ap)
와 마지막 고정 매개변수
를 받는다. va_list의 주소값
에 고정 매개변수
의 크기를 더한 위치로 ap
를 초기화시키기 때문에 마지막으로 입력된 고정 매개변수
가 필요하다.
ap 포인터
가 위치한 부분의 데이터를 읽어 반환한다.
va_arg(ap, 자료형);
va_arg(ap, int)
의 형태로 사용한다. ap 포인터
가 입력받은 자료형의 크기만큼 이동하기 때문에 그 다음 변수에 접근할 수 있다.
va_list
타입을null
로 초기화한다.
va_end(ap)
한 번의 연산에 하나의 들어가게끔 클래스(구조체)에 바이트를 추가하여
CPU
접근에 부하를 덜어주는 것이다.
class A
{
char c;
int i;
};
1byte
+ 4byte
= 5byte
이다. 그러나 결과는 8byte
이다.32bit CPU
라고 가정할 때, CPU
는 한 번에 32bit
, 즉 4byte
씩 가져와서 연산한다. 그렇기 때문에 1byte
인 char
변수 바로 뒤에 int
변수를 저장하는 경우, int
변수를 읽어들일 때 두 번의 연산이 필요하다.(char 뒤 3byte + 새로 시작하는 1byte) 때문에 char
변수 뒤에 3byte
의 패딩을 추가하여 한 번의 연산으로 int
변수에 접근할 수 있도록 하는 것이다. 단, 메모리가 낭비된다.va_arg
의 원형을 살펴보면 _INTSIZEOF
를 사용함을 알 수 있다. 이는 위와 같은 이유로 변수의 크기 단위가 4byte
로 맞추어졌기 때문이다.char
변수를 읽을 때 va_arg
에 char
가 아닌 int
를 전달해야 한다.