와이즈 토토 9.1.24 문서 | ||||
---|---|---|---|---|
와이즈 토토 : 문서 : 9.1 : 큰 개체 | 토토 : 문서 : 9.1 : ECPG- C에 포함 된 SQL | 제 33 장ECPG- 임베디드와이즈 토토in c | 다음 |
ECPG는 C ++ 응용 프로그램에 대한 제한된 지원이 있습니다. 이것 섹션은 일부 경고를 설명합니다.
theECPG사전 처리기는 입력을 취합니다 C (또는 C와 같은) 및 내장 된 와이즈 토토로 작성된 파일 명령, 임베디드 와이즈 토토 명령을 C 언어로 변환합니다 덩어리, 마지막으로 A 생성.C파일. 사용 된 라이브러리 기능의 헤더 파일 선언 C 언어 청크에 의해ECPG생성 |extern "c"...C ++에서 사용될 때 블록이므로 원활하게 작동해야합니다. C ++에서.
일반적으로ECPG사전 처리기는 C 만 이해합니다. 스페셜을 처리하지 않습니다 C ++ 언어의 구문 및 예약 단어. 그래서 일부 내장 복잡한 C ++ 응용 프로그램 코드로 작성된 와이즈 토토 코드 C ++에 특정한 기능이 올바르게 전처리되지 않을 수 있습니다. 또는 예상대로 작동하지 않을 수도 있습니다.
C ++ 애플리케이션에서 임베디드 와이즈 토토 코드를 사용하는 안전한 방법 C ++ 응용 프로그램이 C 모듈에 ECPG 호출을 숨기고 있습니다. 데이터베이스에 액세스하기 위해 코드 호출 및 함께 연결합니다. 나머지 C ++ 코드와 함께. 보다섹션 33.13.2약 저것.
theECPG사전 처리기가 이해합니다 C의 변수의 범위는 C 언어에서는 오히려 변수의 범위는 코드를 기반으로하기 때문에 간단합니다. 블록. 그러나 C ++에서는 클래스 멤버 변수가 있습니다 선언 된 것과는 다른 코드 블록으로 참조됩니다 위치, 그래서ECPG사전 처리기 클래스 멤버의 범위를 이해하지 못할 것입니다 변수.
예를 들어 다음 경우ECPG사전 처리기는 어떤 선언도 찾을 수 없습니다 변수dbnamein테스트메소드, 오류가 발생합니다 발생하다.
클래스 testcpp Exec 와이즈 토토 시작 선언 섹션; char dbname [1024]; Exec 와이즈 토토 END DELLARE SECTION; 공공의: testcpp (); void test (); ~ testcpp (); ; testcpp :: testcpp () EXEC 와이즈 토토 TESTDB1에 연결; void test :: test () exec 와이즈 토토 select current_database ()에 : 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 DELLARE SECTION; exec 와이즈 토토 select current_database ()에 : tmp; strlcpy (dbname, tmp, sizeof (tmp)); printf ( "current_database = %s \ n", dbname);
이러한 기술적 한계를 이해하면ECPGC ++의 사전 처리기 C 객체와 C ++ 객체를 연결하는 결론에 도달하십시오. C ++ 응용 프로그램이 ECPG를 사용할 수 있도록 링크 단계에서 내장 된 와이즈 토토을 작성하는 것보다 기능이 더 좋습니다 C ++ 코드로 직접 명령. 이 섹션에서는 방법을 설명합니다 C ++ 애플리케이션 코드에서 일부 임베디드 와이즈 토토 명령을 별거하십시오 간단한 예제. 이 예에서는 응용 프로그램입니다 C ++로 구현되는 반면 C 및 ECPG는 Postgresql Server.
세 종류의 파일을 생성해야합니다 : C 파일 (*.pgc), 헤더 파일 및 C ++ 파일:
와이즈 토토 명령이 포함 된 하위 경로 모듈 C.에서 그것은로 변환 될 것입니다test_mod.c사전 처리기에 의해.
#include "test_mod.h" #include <stdio.h 무효의 db_connect () EXEC 와이즈 토토 TESTDB1에 연결; 무효의 db_test () Exec 와이즈 토토 시작 선언 섹션; char dbname [1024]; Exec 와이즈 토토 END DELLARE SECTION; exec 와이즈 토토 select current_database ()에 : dbname; printf ( "current_database = %s \ n", dbname); 무효의 db_disconnect () Exec 와이즈 토토 모든 분리;
함수의 선언이있는 헤더 파일 C 모듈 (test_mod.pgc). 그것 에 의해 포함test_cpp.cpp. 이 파일에는가 있어야합니다.extern "기음"선언 주변의 차단 C ++ 모듈에서 연결하십시오.
#ifdef __cplusplus extern "c" #endif void db_connect (); void db_test (); void db_disconnect (); #ifdef __cplusplus
를 포함한 응용 프로그램의 기본 코드Main
루틴, 그리고 이것
예제 C ++ 클래스.
#include "test_mod.h" 클래스 testcpp 공공의: testcpp (); void test (); ~ testcpp (); ; testcpp :: testcpp () db_connect (); 무효의 testcpp :: test () db_test (); testcpp :: ~ testcpp () db_disconnect (); int 메인 (void) testcpp *t = new testcpp (); t- test (); 반환 0;
응용 프로그램을 작성하려면 다음과 같이 진행하십시오. 전환하다test_mod.pgcintest_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.oby 컴파일test_cpp.cppC ++와 함께 컴파일러:
C ++ -C Test_cpp.cpp -o test_cpp.o
마지막 으로이 객체 파일을 연결하십시오.test_cpp.oandtest_mod.o, C ++를 사용하여 하나의 실행 파일로 컴파일러 드라이버 :
c ++ test_cpp.o test_mod.o -lecpg -o test_cpp