외부 함수
외부 함수 (External functions)
external 수정자는 외부 오브젝트 파일에 있는 함수를 선언하는 데 사용해요. 코드에서 그 함수를 사용할 수 있게 해주고, 링크 시점에 구현이 담긴 오브젝트 파일을 링크해야 해요.
출처: 문서
본문
external 수정자(modifier)는 외부 오브젝트 파일에 있는 함수를 선언하는 데 사용해요. 코드 안에서 그 함수를 사용할 수 있게 해주고, 링크 시점에 그 함수·프로시저 구현이 담긴 오브젝트 파일을 링크해야 하죠.
이 지시어는 사실상 함수·프로시저의 코드 블록을 대체해요. 예시를 볼게요.
program CmodDemo;
{$Linklib c}
Const P : PChar = 'This is fun !';
Function strlen (P : PChar) : Longint; cdecl; external;
begin
WriteLn ('Length of (',p,') : ',strlen(p))
end.
참고: 외부 함수 선언의 매개변수는 오브젝트 파일 안의 선언과 정확히 일치해야 해요.
external 수정자 뒤에 문자열 상수가 오면, 함수가 들어 있는 라이브러리를 지정할 수 있어요.
external 'lname';
이것은 함수가 "lname" 라이브러리에 있다는 뜻이에요. 컴파일러는 이 라이브러리를 자동으로 프로그램에 링크해요.
라이브러리 안의 함수 이름도 지정할 수 있어요.
external 'lname' name 'Fname';
이것은 함수가 "lname" 라이브러리에 있지만 이름은 "Fname"이라는 뜻이에요. 컴파일러는 라이브러리를 프로그램에 자동으로 링크하고, 함수에 올바른 이름을 사용해요.
Windows와 OS/2에서는 다음 형태도 사용할 수 있어요.
external 'lname' Index Ind;
이것은 함수가 "lname" 라이브러리에 있지만 인덱스는 Ind라는 뜻이에요. 컴파일러는 라이브러리를 프로그램에 자동으로 링크하고, 함수에 올바른 인덱스를 사용해요.
마지막으로 external 지시어는 함수의 외부 이름을 지정하는 데도 사용할 수 있어요.
external name 'Fname';
{$L myfunc.o}
이것은 함수의 이름이 "Fname"이라는 뜻이에요. 올바른 라이브러리나 오브젝트 파일(여기서는 myfunc.o)을 여전히 링크해야 하며, 그래야 "Fname" 함수가 링크 단계에 실제로 포함돼요.