타입 없는 매개변수
타입 없는 매개변수 (Untyped parameters)
매개변수에 특정 타입을 지정하지 않고, 단지 "주소"만 넘기고 싶을 때가 있어요. Free Pascal에서는 변수, out, 상수 매개변수를 타입 없이(untyped) 선언할 수 있어요. 이 경우 루틴에는 타입 정보가 없는 주소만 전달돼요.
본문
변수, out, 상수 매개변수는 타입 없이 선언될 수 있어요. 이 경우 프로시저나 함수에서 그 변수에는 타입이 없으므로, 다른 모든 타입과 호환되지 않아요. 컴파일러는 단순히 전달된 변수의 주소를 루틴에 넘겨요. 그래서 호출된 루틴에서 사용할 수 있는 것은, 타입 정보가 전혀 붙어 있지 않은 주소뿐이에요. 이것은 const 매개변수의 경우에도 마찬가지예요.
비유를 들어 볼게요. 다음 Pascal 선언은
procedure Something(const Data; Len: cint);
다음 C/C++ 선언과 동등해요.
void Something(void* Data; int Len);
이 말은 루틴 안에서 할 수 있는 일이 대부분 주소 연산자(@)를 쓰거나, 그 인자를 역시 타입 없는 매개변수를 가진 다른 함수에 넘기는 것뿐이라는 뜻이에요.
타입 없는 매개변수를 가진 루틴 안에서, 그 타입 없는 매개변수가 표현식에 쓰이거나 값이 할당되어야 한다면 반드시 typecast를 사용해야 해요.
다음 예시가 이를 보여줘요.
{$mode objfpc}
uses types;
procedure doit(const d);
begin
Writeln('As integer: ',PInteger(@D)^);
Writeln('As Byte : ',PByte(@D)^);
end;
Var
D : Integer;
begin
D:=$0FFFFFF0;
DoIt(D);
end.
이 코드는 다음과 같이 출력해요.
As integer: 268435440
As Byte : 240
주소가 필요하기 때문에, 함수나 프로시저에 상수 표현식을 전달할 수는 없어요. 예를 들어 위 정의가 주어졌을 때, 다음은 동작하지 않아요.
DoIt($0FFFFFF0);
이것은 다음과 같은 에러를 만들어내요.
Error: Variable identifier expected
더 알아보기
- 타입 없는 매개변수는 변수/out/상수 매개변수의 확장이에요. 14.4.2, 14.4.3, 14.4.4를 함께 보면 좋아요.
- 주소 연산자
@와 typecast 사용법도 함께 살펴보면 좋아요.