이 문서는 지원되지 않는 Postgre사설 토토 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 34.13. C ++ 토토 프로그램버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

33.13. C++애플리케이션

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

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

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

C++ 응용프로그램에 포함된 사설 토토 코드를 사용하는 안전한 방법은 다음과 같습니다. C++ 애플리케이션 코드가 C 모듈에서 ECPG 호출을 숨기는 경우 데이터베이스에 액세스하기 위해 호출하고 이를 함께 연결합니다. 나머지 C++ 코드. 참조섹션 33.13.2그것에 대해.

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

33.13.2. 외부를 이용한 C++ 애플리케이션 개발 C 모듈

이러한 기술적 한계를 이해한다면ecpgC++의 전처리기, 당신은 링크 단계에서 C 객체와 C++ 객체를 연결한다는 결론 C++ 애플리케이션이 ECPG 기능을 사용할 수 있도록 하는 것이 더 나을 수 있습니다. 일부 임베디드 사설 토토 명령을 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