| Postgre와이즈 토토 9.1.24 문서 | ||||
|---|---|---|---|---|
| 와이즈 토토 : 문서 : 9.1 : 큰 개체 | 토토 : 문서 : 9.1 : ECPG- C에 포함 된 SQL | 33장.ECPG- 임베디드와이즈 토토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정보 그거.
그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);
이러한 기술적 한계를 이해한다면ecpgC++의 전처리기, 아마도 C 객체와 C++ 객체를 연결한다는 결론에 도달했습니다. C++ 애플리케이션이 ECPG를 사용할 수 있도록 링크 단계에서 일부 내장 와이즈 토토을 작성하는 것보다 기능이 더 나을 수 있습니다. C++ 코드에서 직접 명령을 실행합니다. 이 섹션에서는 다음 방법을 설명합니다. C++ 애플리케이션 코드에서 일부 내장 와이즈 토토 명령을 분리합니다. 간단한 예를 들어 보겠습니다. 이 예에서 애플리케이션은 다음과 같습니다. C++로 구현되었으며 C와 ECPG는 Postgre와이즈 토토 서버입니다.
세 종류의 파일이 생성되어야 합니다: C 파일 (*.pgc), 헤더 파일 및 C++ 파일:
와이즈 토토 명령을 실행하는 서브루틴 모듈이 내장되어 있습니다. 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 와이즈 토토 모두 연결 해제;
함수 선언이 포함된 헤더 파일 C 모듈(test_mod.pgc). 그것 에 포함됩니다.test_cpp.cpp. 이 파일에는외부 "ㄷ"선언 주위를 차단하세요. C++ 모듈에서 연결됩니다.
#ifdef __cplusplus 외부 "C" #endif 무효 db_connect(); 무효 db_test(); 무효 db_disconnect(); #ifdef __cplusplus
다음을 포함한 응용프로그램의 기본 코드메인루틴이고, 여기서는
예를 들어 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