ECPG는 C++ 응용프로그램에 대해 일부 제한적인 지원을 제공합니다. 이 섹션에서는 몇 가지 주의 사항을 설명합니다.
그ecpg전처리기는 C(또는 C와 유사한 것)로 작성된 입력 파일과 내장 와이즈 토토 명령을 가져와 내장 와이즈 토토 명령을 C 언어 청크로 변환하고 마지막으로 다음을 생성합니다..c파일. C 언어 청크에서 사용하는 라이브러리 함수의 헤더 파일 선언입니다.ecpg생성물이 래핑됩니다외부 "C" ...C++에서 사용될 때 차단되므로 C++에서 원활하게 작동해야 합니다.
그러나 일반적으로,ecpg전처리기는 C만 이해합니다. C++ 언어의 특수 구문과 예약어는 처리하지 않습니다. 따라서 C++ 관련 복잡한 기능을 사용하는 C++ 애플리케이션 코드로 작성된 일부 Embedded 와이즈 토토 코드는 올바르게 전처리되지 않거나 예상대로 작동하지 않을 수 있습니다.
C++ 애플리케이션에 내장된 와이즈 토토 코드를 사용하는 안전한 방법은 C++ 애플리케이션 코드가 데이터베이스에 액세스하기 위해 호출하는 C 모듈의 ECPG 호출을 숨기고 이를 나머지 C++ 코드와 함께 연결하는 것입니다. 참조섹션 36.13.2그것에 대해.
그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);
이러한 기술적 한계를 이해한다면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
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.