34.13. C++애플리케이션#

ECPG는 C++ 응용프로그램을 일부 제한적으로 지원합니다. 이 섹션에서는 몇 가지 주의 사항을 설명합니다.

ecpg전처리기는 C(또는 C와 유사한 것)로 작성된 입력 파일과 내장된 토토 명령을 가져와서 내장된 토토 명령을 C 언어 청크로 변환하고 마지막으로 다음을 생성합니다..c파일. C 언어 청크에서 사용하는 라이브러리 함수의 헤더 파일 선언입니다.ecpg생성물이 래핑됩니다extern "C" ...C++에서 사용될 때 차단되므로 C++에서 원활하게 작동해야 합니다.

그러나 일반적으로,ecpg전처리기는 C만 이해합니다. C++ 언어의 특수 구문과 예약어는 처리하지 않습니다. 따라서 C++ 관련 복잡한 기능을 사용하는 C++ 애플리케이션 코드로 작성된 일부 Embedded 토토 코드는 올바르게 전처리되지 않거나 예상대로 작동하지 않을 수 있습니다.

C++ 애플리케이션에 내장된 토토 코드를 사용하는 안전한 방법은 C++ 애플리케이션 코드가 데이터베이스에 액세스하기 위해 호출하는 C 모듈의 ECPG 호출을 숨기고 이를 나머지 C++ 코드와 함께 연결하는 것입니다. 참조섹션 34.13.2그것에 대해.

34.13.1. 호스트 변수의 범위#

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

예를 들어, 다음 경우에는ecpg전처리기가 변수에 대한 선언을 찾을 수 없습니다.DB이름에서테스트메서드이므로 오류가 발생합니다.

클래스 TestCpp

    EXEC 토토 시작 선언 섹션;
    char 데이터베이스 이름[1024];
    EXEC 토토 END 선언 섹션;

  공개:
    테스트Cpp();
    무효 테스트();
    ~테스트Cpp();
;

테스트Cpp::테스트Cpp()

    EXEC 토토 CONNECT TO testdb1;
    EXEC 토토 SELECT pg_catalog.set_config('search_path', '', false); EXEC 토토 커밋;

무효 테스트::test()

    EXEC 토토 SELECT current_database() INTO :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 선언 섹션;

    EXEC 토토 SELECT current_database() INTO :tmp;
    strlcpy(데이터베이스 이름, tmp, sizeof(tmp));

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

34.13.2. 외부 C 모듈을 사용한 C++ 애플리케이션 개발#

이러한 기술적 한계를 이해하신다면ecpgC++의 전처리기에서 C++ 애플리케이션이 ECPG 기능을 사용할 수 있도록 링크 단계에서 C 개체와 C++ 개체를 연결하는 것이 C++ 코드에 일부 내장 토토 명령을 직접 작성하는 것보다 낫다는 결론에 도달할 수 있습니다. 이 섹션에서는 간단한 예를 통해 일부 Embedded 토토 명령을 C++ 애플리케이션 코드에서 분리하는 방법을 설명합니다. 이 예에서 애플리케이션은 C++로 구현되었으며 C 및 ECPG는 Postgre토토 서버에 연결하는 데 사용되었습니다.

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

test_mod.pgc #

C에 포함된 토토 명령을 실행하는 서브루틴 모듈입니다. 다음으로 변환됩니다.test_mod.c전처리기에 의해.

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

무효
DB_연결()

    EXEC 토토 CONNECT TO testdb1;
    EXEC 토토 SELECT pg_catalog.set_config('search_path', '', false); EXEC 토토 커밋;

무효
DB_테스트()

    EXEC 토토 시작 선언 섹션;
    char 데이터베이스 이름[1024];
    EXEC 토토 END 선언 섹션;

    EXEC 토토 SELECT current_database() INTO :dbname;
    printf("current_database = %s\n", dbname);

무효
db_disconnect()

    EXEC 토토 모두 연결 해제;
test_mod.h #

C 모듈의 함수 선언이 포함된 헤더 파일(test_mod.pgc). 에 포함되어 있습니다.test_cpp.cpp. 이 파일에는외부 "C"선언 주위를 차단하세요. C++ 모듈에서 연결되기 때문입니다.

#ifdef __cplusplus
외부 "C" 
#endif

무효 db_connect();
무효 db_test();
무효 db_disconnect();

#ifdef __cplusplus
test_cpp.cpp #

다음을 포함한 응용 프로그램의 기본 코드메인루틴이며 이 예에서는 C++ 클래스입니다.

#include "test_mod.h"

클래스 TestCpp

  공개:
    테스트Cpp();
    무효 테스트();
    ~테스트Cpp();
;

테스트Cpp::테스트Cpp()

    db_connect();

무효
TestCpp::테스트()

    db_test();

TestCpp::~TestCpp()

    db_disconnect();

정수
메인(공허)

    TestCpp *t = 새로운 TestCpp();

    t-테스트();
    0을 반환합니다.

애플리케이션을 빌드하려면 다음과 같이 진행하세요. 변환test_mod.pgc속으로test_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.o그리고test_mod.o, C++ 컴파일러 드라이버를 사용하여 하나의 실행 파일로:

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

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.