gprolog.h 포함 및 사용

gprolog.h 포함 및 사용

C 코드에서 gprolog.h 헤더를 포함하고 사용하는 방법을 설명해요.

출처: GNU Prolog Manual - Including and using gprolog.h

본문

C 코드는 API와 연관된 C 정의(유형, 매크로, 프로토타입) 집합을 제공하는 gprolog.h를 포함해야 해요. 다음과 같이 이 파일을 포함해요:

#include <gprolog.h>

설치가 올바르게 되었다면 다른 것은 필요하지 않아요. C 컴파일러/전처리기가 gprolog.h를 찾을 수 없으면 필요한 추가 포함 디렉토리를 지정하는 C 컴파일러 옵션(예: -Iinclude_dir)을 gplc에 다음과 같이 전달해요(4.4.3절):

% gplc -C -I include_dir ...

gprolog.h는 다음 C 유형을 선언해요:

  • PlBool — 정수이며 상수 PL_FALSE(즉 0)와 PL_TRUE(즉 1).
  • PlLong — 포인터를 저장할 수 있는 정수(intptr_t와 동일). 이 유형은 Windows 64비트를 지원하기 위해 GNU Prolog 1.4.0에서 long을 대체해 등장했어요(Windows에서 long 유형은 32비트뿐). 이 유형은 정수 유형을 처리하는 데 사용.
  • PlULong — PlLong과 같지만 부호 없음(uintptr_t와 동일).
  • PlTermintptr_t와 동일. 이 유형은 일반적인 Prolog 항을 저장하는 데 사용.

GNU Prolog 1.3.1의 새 기능 및 이전 버전과의 호환성 문제: GNU Prolog 1.3.1에서 API가 네임스페이스를 보호하도록 수정됐어요. 공개 함수, 매크로, 변수 및 유형의 이름은 이제 Pl_, PL_ 또는 pl_로 접두사가 붙어요. 이름 충돌을 방지하기 위해 외부 C 코드는 이 모든 접두사를 피해야 해요. 이전 버전과의 호환성을 보장하기 위해 이전 API가 사용한 이름은 #define 집합 덕분에 사용할 수 있어요. 그러나 이 구식(deprecated) API는 최근 코드에서 사용해서는 안 돼요. 다음과 같이 호환성 매크로의 정의를 방지하는 것도 가능해요:

#define __GPROLOG_FOREIGN_STRICT__
#include <gprolog.h>

추가로 gprolog.h는 매크로 집합을 정의해요:

  • __GNU_PROLOG__, __GPROLOG__, __GPROLOG_MINOR__, __GPROLOG_PATCHLEVEL__ — 그 값은 GNU Prolog의 메이저 버전, 마이너 버전(주의: 이름이 __GPROLOG__인 매크로가 마이너 버전을 담음), 패치 레벨을 정수 상수로 담아요. 예를 들어 GNU Prolog 1.3.2는 __GNU_PROLOG__를 1, __GPROLOG__를 3, __GPROLOG_MINOR__를 3, __GPROLOG_PATCHLEVEL__을 2로 정의해요. 특정 버전에 의존하는 코드를 작성해야 한다면 더 주의해야 해요. 이 매크로들은 GNU Prolog 1.3.1에 등장했으며(이전에는 미정의), 마이너 버전이 증가할 때마다 패치 레벨이 0으로 재설정되고, 메이저 버전이 증가할 때마다(드물게 발생) 마이너 버전과 패치 레벨이 재설정된다는 점을 기억해요.
  • __GPROLOG_VERSION__ — 버전을 다음과 같이 정의된 정수로: major * 10000 + minor * 100 + patch level. 예: 버전 1.3.2는 값 10302.
  • PL_PROLOG_DIALECT — C 상수 문자열(일반적으로 "gprolog"). 1.3.2에 등장.
  • PL_PROLOG_NAME — C 상수 문자열(일반적으로 "GNU Prolog").
  • PL_PROLOG_VERSION — 버전과 연관된 C 상수 문자열(예: "1.4.0").
  • PL_PROLOG_DATE — 이 버전의 날짜와 연관된 C 상수 문자열(예: "Mar 29 2011").
  • PL_PROLOG_COPYRIGHT — 이 버전의 저작권과 연관된 C 상수 문자열(예: "Copyright (C) 1999-2021 Daniel Diaz").

위의 PL_PROLOG_... 매크로들은 내장 술어 current_prolog_flag/2(8.22.2절) 덕분에 Prolog 플래그에서도 접근할 수 있다는 점에 주의해요.

더 알아보기