cdecl 수정자

cdecl 수정자

C 언어로 만든 함수를 Pascal에서 호출해야 할 때가 있어요. cdecl 수정자는 C 타입 호출 규약을 사용하는 함수를 선언할 수 있게 해줘요.

출처: Free Pascal Reference - cdecl

본문

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)을 함께 살펴보면 도움이 돼요.