varargs — 가변 인자를 받는 외부 C 프로시저
varargs — 가변 인자를 받는 외부 C 프로시저
C의 printf 같은 함수는 인자 개수가 정해져 있지 않은데, Pascal 쪽에서 그걸 그대로 받아 쓸 수 있어요. varargs 한정자가 그 역할을 해 줘요.
본문
varargs 한정자는 외부 C 프로시저를 위해 cdecl 한정자와 함께만 쓸 수 있어요. 이 한정자가 붙으면 프로시저가 마지막으로 선언된 변수 뒤에 오는 인자를 개수에 상관없이 받는다는 뜻이 돼요. 그렇게 넘어온 인자들은 타입 검사 없이 그대로 전달돼요.
사실 이 한정자는 cdecl 프로시저에서 array of const 구문을 쓰는 것과 같은 효과예요. 다만 array of const를 일일이 선언할 필요 없이 간단하게 쓸 수 있죠. 그리고 이 형태를 쓰면 가변 인자 주변의 대괄호도 필요 없어요.
다음 두 선언은 C 라이브러리의 같은 함수를 가리키는 서로 다른 표기예요:
Function PrintF1(fmt : pchar); cdecl; varargs;
external 'c' name 'printf';
Function PrintF2(fmt : pchar; Args : Array of const); cdecl;
external 'c' name 'printf';
하지만 호출할 때는 둘이 달라요:
PrintF1('%d %d\n',1,1);
PrintF2('%d %d\n',[1,1]);
PrintF1은 인자를 컴마로 바로 이어 나가고, PrintF2는 배열 대괄호로 묶어 주는 차이가 보이죠. 외부 C 함수와 연동할 때 이 차이만 잘 기억하면 돼요.
더 알아보기
- SYSV_ABI_CDecl — array of const를 cdecl 가변 인자로 해석하는 변형
- winapi — 플랫폼에 따라 stdcall/cdecl을 자동 선택
- cdecl 관련 호출 규약 문서들