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를 전달해야 한다.