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

33.13. C++애플리케이션

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

ecpg전처리기가 입력을 받습니다. 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. 호스트 변수의 범위

ecpg전처리기가 이해함 C의 변수 범위. C 언어에서 이는 오히려 변수의 범위는 코드에 따라 결정되므로 간단합니다. 블록. 그러나 C++에서는 클래스 멤버 변수가 다음과 같습니다. 선언된 코드 블록과 다른 코드 블록에서 참조됨 위치이므로ecpg전처리기 클래스 멤버의 범위를 이해하지 못합니다 변수.

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

클래스 TestCpp

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

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

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

    EXEC 와이즈 토토 CONNECT TO testdb1;

무효 테스트::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++ 코드에서 직접 명령을 실행합니다. 이 섹션에서는 다음 방법을 설명합니다. 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;

무효
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++ 모듈에서 연결됩니다.

#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