@ 연산자
@ 연산자
주소 연산자 @는 변수, 프로시저 또는 함수의 주소를 반환해요. 다음과 같이 사용해요.
본문
@ 연산자는 $T 스위치가 켜져 있으면 타입이 있는 포인터(typed pointer)를 반환해요. $T 스위치가 꺼져 있으면 타입이 없는 포인터(untyped pointer)를 반환하는데, 이는 모든 포인터 타입과 대입 호환이 돼요. 포인터의 타입은 ^T인데, 여기서 T는 variable reference의 타입이에요. 예를 들어 다음은 컴파일돼요.
Program tcast;
{$T-} { @ returns untyped pointer }
Type art = Array[1..100] of byte;
Var Buffer : longint;
PLargeBuffer : ^art;
begin
PLargeBuffer := @Buffer;
end.
{$T-}를 {$T+}로 바꾸면 컴파일러가 이 코드를 컴파일하지 못해요. 타입 불일치 오류가 나게 되죠.
기본적으로 주소 연산자는 타입이 없는 포인터를 반환해요. 함수, 메서드 또는 프로시저 식별자에 주소 연산자를 적용하면 그 함수의 시작 지점(entry point)을 가리키는 포인터가 돼요. 결과는 타입이 없는 포인터랍니다.
즉, 다음은 동작해요.
Procedure MyProc;
begin
end;
Var
P : PChar;
begin
P:=@MyProc;
end.
기본적으로, 프로시저 타입 변수에 값을 대입해야 한다면 주소 연산자를 써야 해요. 이 동작은 -Mtp나 -MDelphi 스위치로 피할 수 있는데, 이 스위치들은 더 호환성 있는 Delphi 또는 Turbo Pascal 문법을 만들어 줘요.
더 알아보기
- 프로시저 타입 변수에 대한 대입과
@의 관계는 함수 호출 섹션에서 다뤄요. @가 타입이 있는/없는 포인터를 반환하는지 결정하는$T스위치는 관련 스위치 문서에서 확인할 수 있어요.