34.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 ++ 응용 토토 코드가 데이터베이스에 액세스하기 위해 호출하고 나머지 C ++ 코드와 연결하는 C 모듈에 ECPG 호출을 숨기고 있습니다. 보다섹션 34.13.2그것에 대해.

34.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);

34.13.2. 외부 C 모듈을 사용한 C ++ 응용 토토 개발#

이러한 기술적 한계를 이해하면ECPGC ++의 사전 처리기 C ++에서 C ++ 응용 토토을 사용하여 ECPG 기능을 사용할 수 있도록 링크 단계에서 C 객체 및 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

수정 제출

토토에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식토토 문제를보고하려면