cdecl 수정자
cdecl 수정자
C 언어로 만든 함수를 Pascal에서 호출해야 할 때가 있어요. cdecl 수정자는 C 타입 호출 규약을 사용하는 함수를 선언할 수 있게 해줘요.
본문
cdecl 수정자는 C 타입 호출 규약을 사용하는 함수를 선언하는 데 쓸 수 있어요. 이것은 표준 C 컴파일러가 생성한 객체 파일에 있는 함수에 접근할 때 반드시 사용해야 해요. 또한 C 라이브러리의 콜백으로 사용될 Pascal 함수에도 반드시 사용해야 해요.
cdecl 수정자는 코드에서 C 함수를 사용할 수 있게 해줘요. 외부 C 함수의 경우, 그 함수/프로시저의 C 구현이 들어 있는 객체 파일을 링크해야 해요. 예시를 볼게요.
program CmodDemo;
{$LINKLIB c}
Const P : PChar = 'This is fun !';
Function StrLen(P: PChar): Longint;cdecl; external name 'strlen';
begin
WriteLn ('Length of (',p,') : ',StrLen(p));
end.
이것을 컴파일하고 C 라이브러리에 링크하면, 프로그램 전체에서 strlen 함수를 호출할 수 있어요. external 지시자는 그 함수가 "strlen"이라는 이름의 외부 객체 파일이나 라이브러리에 있다는 것을 컴파일러에게 알려줘요(14.7 참고).
참고: C 함수를 선언할 때 우리의 매개변수는 C의 선언에 있는 것과 정확히 일치해야 해요.
외부 함수는 아니지만 cdecl로 선언된 함수들은 외부 링크가 필요 없어요. 다만 이런 함수에는 몇 가지 제약이 있어요. 예를 들어 array of const 구문은 사용할 수 없어요(스택 사용 방식 때문이에요). 반면 cdecl 수정자는 이런 함수들을 C로 작성된 루틴의 콜백으로 사용할 수 있게 해줘요. 후자는 "cdecl" 호출 규약을 기대하기 때문이에요.
더 알아보기
- 여러 호출 규약 수정자(
stdcall,cdecl,cppdecl등)를 비교해 보면 좋아요. external지시자와 링크 방식(14.7)을 함께 살펴보면 도움이 돼요.