이 문서는 지원되지 않는 버전의 Postgre토토 핫 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 34.13. C ++ 토토 프로그램버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

33.13. C ++응용 프로그램

ECPG는 C ++ 애플리케이션에 대한 제한된 지원이 있습니다. 이 섹션은 일부 경고에 대해 설명합니다.

theECPGPreprocessor는 C (또는 C와 같은) 및 내장 된 토토 핫 명령으로 작성된 입력 파일을 가져 와서 임베디드 토토 핫 명령을 C 언어 청크로 변환하고 마지막으로 A를 생성합니다..C파일. C Language Chunks가 사용한 라이브러리 기능의 헤더 파일 선언ECPG생성 |extern "c"...C ++에서 사용될 때 블록이므로 C ++에서 원활하게 작동해야합니다.

일반적으로ECPG사전 처리기는 C 만 이해합니다. C ++ 언어의 특수 구문 및 예약 된 단어를 처리하지 않습니다. 따라서 C ++에 특정한 복잡한 기능을 사용하는 C ++ 애플리케이션 코드로 작성된 일부 임베디드 토토 핫 코드는 올바르게 전처리되지 않거나 예상대로 작동하지 않을 수 있습니다.

C ++ 애플리케이션에서 임베디드 토토 핫 코드를 사용하는 안전한 방법은 C 모듈에 ECPG 호출을 숨기고 있는데, 이는 C ++ 응용 프로그램 코드가 데이터베이스에 액세스하기 위해 호출하고 나머지 C ++ 코드와 연결합니다. 보다섹션 33.13.2그것에 대해.

33.13.1. 호스트 변수 범위

theecpg사전 처리기는 C의 변수 범위를 이해합니다. C 언어에서는 변수의 범위가 코드 블록을 기반으로하기 때문에 다소 간단합니다. 그러나 C ++에서 클래스 멤버 변수는 선언 된 위치와 다른 코드 블록으로 참조되므로ECPG사전 처리기는 클래스 멤버 변수의 범위를 이해하지 못할 것입니다.

예를 들어 다음 경우ECPG사전 처리기는 변수에 대한 선언을 찾을 수 없습니다dbnamein테스트메소드, 오류가 발생합니다.

클래스 testcpp

    Exec 토토 핫 시작 선언 섹션;
    char dbname [1024];
    Exec 토토 핫 END DELLARE SECTION;

  공공의:
    testcpp ();
    void test ();
    ~ testcpp ();
;

testcpp :: testcpp ()

    EXEC 토토 핫 TESTDB1에 연결;
    Exec 토토 핫 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec 토토 핫 커밋;

void test :: test ()

    exec 토토 핫 select current_database ()에 : dbname;
    printf ( "current_database = %s \ n", dbname);

testcpp :: ~ testcpp ()

    Exec 토토 핫 모든 분리;

이 코드는 다음과 같은 오류가 발생합니다.

ecpg test_cpp.pgctest_cpp.pgc : 28 : 오류 : 변수 "dbname"이 선언되지 않았습니다

이 범위 문제를 피하려면테스트메소드는 로컬 변수를 중간 저장소로 사용하도록 수정할 수 있습니다. 그러나이 접근법은 코드를 확장하고 성능을 줄이기 때문에 해결 방법이 좋지 않습니다.

void testcpp :: test ()

    Exec 토토 핫 시작 선언 섹션;
    Char TMP [1024];
    Exec 토토 핫 END DELLARE SECTION;

    exec 토토 핫 select current_database ()에 : tmp;
    strlcpy (dbname, tmp, sizeof (tmp));

    printf ( "current_database = %s \ n", dbname);

33.13.2. 외부 C 모듈을 사용한 C ++ 응용 프로그램 개발

이러한 기술적 한계를 이해하면ECPGC ++의 사전 처리기 C ++에서 C ++ 응용 프로그램을 사용하여 ECPG 기능을 사용하는 것이 C ++ 코드에 직접 내장 된 토토 핫 명령을 직접 작성하는 것보다 C ++ 응용 프로그램을 연결하는 것이 더 나을 수 있다는 결론을 내릴 수 있습니다. 이 섹션에서는 간단한 예제로 C ++ 응용 프로그램 코드에서 일부 임베디드 토토 핫 명령을 분리하는 방법을 설명합니다. 이 예에서 응용 프로그램은 C ++에서 구현되며 C 및 ECPG는 Postgre토토 핫 서버에 연결하는 데 사용됩니다.

세 종류의 파일을 생성해야합니다 : C 파일 (*.pgc), 헤더 파일 및 C ++ 파일 :

test_mod.pgc

C에 내장 된 토토 핫 명령을 실행하기위한 하위 경로 모듈.test_mod.c사전 처리기의

#include "test_mod.h"
#include <stdio.h

무효의
db_connect ()

    EXEC 토토 핫 TESTDB1에 연결;
    Exec 토토 핫 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec 토토 핫 커밋;

무효의
db_test ()

    Exec 토토 핫 시작 선언 섹션;
    char dbname [1024];
    Exec 토토 핫 END DELLARE SECTION;

    exec 토토 핫 select current_database ()에 : dbname;
    printf ( "current_database = %s \ n", dbname);

무효의
db_disconnect ()

    Exec 토토 핫 모든 분리;
test_mod.h

C 모듈에 함수의 선언이있는 헤더 파일 (test_mod.pgc). 에 포함되어 있습니다.test_cpp.cpp. 이 파일에는가 있어야합니다.extern "c"선언 주위의 차단은 C ++ 모듈에서 연결되기 때문에

#ifdef __cplusplus
extern "c"
#endif

void db_connect ();
void db_test ();
void db_disconnect ();

#ifdef __cplusplus
test_cpp.cpp

Main루틴,이 예에서는 C ++ 클래스

#include "test_mod.h"

클래스 testcpp

  공공의:
    testcpp ();
    void test ();
    ~ testcpp ();
;

testcpp :: testcpp ()

    db_connect ();

무효의
testcpp :: test ()

    db_test ();

testcpp :: ~ testcpp ()

    db_disconnect ();

int
메인 (void)

    testcpp *t = new testcpp ();

    t- test ();
    반환 0;

응용 프로그램을 작성하려면 다음과 같이 진행하십시오. 전환하다test_mod.pgcintest_mod.c실행ECPG및 생성test_mod.o컴파일test_mod.cC 컴파일러와 함께 :

ecpg -o test_mod.c test_mod.pgc
cc -c test_mod.c -o test_mod.o

다음, 생성test_cpp.o컴파일test_cpp.cppC ++ 컴파일러와 함께 :

C ++ -C Test_cpp.cpp -o test_cpp.o

마지막 으로이 객체 파일을 연결하십시오.test_cpp.oandtest_mod.o, C ++ 컴파일러 드라이버를 사용하여 하나의 실행 파일로 :

c ++ test_cpp.o test_mod.o -lecpg -o test_cpp