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

33.13. C ++응용 프로그램

ECPG는 C ++ 응용 프로그램에 대한 제한된 지원이 있습니다. 이것 섹션은 일부 경고를 설명합니다.

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

일반적으로ECPG사전 처리기는 C 만 이해합니다. 스페셜을 처리하지 않습니다 C ++ 언어의 구문 및 예약 단어. 그래서 일부 내장 복잡한 C ++ 응용 프로그램 코드로 작성된 와이즈 토토 코드 C ++에 특정한 기능이 올바르게 전처리되지 않을 수 있습니다. 또는 예상대로 작동하지 않을 수도 있습니다.

C ++ 애플리케이션에서 임베디드 와이즈 토토 코드를 사용하는 안전한 방법 C ++ 응용 프로그램이 C 모듈에 ECPG 호출을 숨기고 있습니다. 데이터베이스에 액세스하기 위해 코드 호출 및 함께 연결합니다. 나머지 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에 연결;

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 ++ 객체를 연결하는 결론에 도달하십시오. C ++ 응용 프로그램이 ECPG를 사용할 수 있도록 링크 단계에서 내장 된 와이즈 토토을 작성하는 것보다 기능이 더 좋습니다 C ++ 코드로 직접 명령. 이 섹션에서는 방법을 설명합니다 C ++ 애플리케이션 코드에서 일부 임베디드 와이즈 토토 명령을 별거하십시오 간단한 예제. 이 예에서는 응용 프로그램입니다 C ++로 구현되는 반면 C 및 ECPG는 Postgresql Server.

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

test_mod.pgc

와이즈 토토 명령이 포함 된 하위 경로 모듈 C.에서 그것은로 변환 될 것입니다test_mod.c사전 처리기에 의해.

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

무효의
db_connect ()

    EXEC 와이즈 토토 TESTDB1에 연결;

무효의
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 ++ 모듈에서 연결하십시오.

#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.oby 컴파일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