Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

35.13.C ++Ứng tỷ lệ kèo bóng đá 88

ECPG có một số hỗ trợ hạn chế cho các ứng tỷ lệ kèo bóng đá 88 C ++. Phần này mô tả một số cảnh báo.

TheECPG9487_9668.cTệp. Tệp tiêu đề khai báo của các chức năng thư viện được sử tỷ lệ kèo bóng đá 88 bởi các khối ngôn ngữ c màECPGTạo được gói trongBên ngoài "C" ...Khối khi được sử tỷ lệ kèo bóng đá 88 theo C ++, vì vậy chúng nên hoạt động liền mạch trong C ++.

9977_10004ECPGBộ tiền xử lý chỉ hiểu C; Nó không xử lý các cú pháp đặc biệt và các từ dành riêng của ngôn ngữ C ++. Vì vậy, một số mã SQL nhúng được viết trong mã ứng tỷ lệ kèo bóng đá 88 C ++ sử tỷ lệ kèo bóng đá 88 các tính năng phức tạp cụ thể cho C ++ có thể không được xử lý chính xác hoặc có thể không hoạt động như mong đợi.

Một cách an toàn để sử tỷ lệ kèo bóng đá 88 mã SQL được nhúng trong ứng tỷ lệ kèo bóng đá 88 C ++ đang ẩn các cuộc gọi ECPG trong mô -đun C mà mã ứng tỷ lệ kèo bóng đá 88 C ++ gọi vào để truy cập cơ sở dữ liệu và liên kết cùng với phần còn lại của mã C ++. Nhìn thấyPhần 35.13.2về điều đó.

35.13.1. Phạm vi cho các biến máy chủ

TheECPGBộ tiền xử lý hiểu phạm vi của các biến trong C. Trong ngôn ngữ C, điều này khá đơn giản vì phạm vi của các biến dựa trên các khối mã của chúng. Tuy nhiên, trong C ++, các biến thành viên lớp được tham chiếu trong một khối mã khác với vị trí được khai báo, vì vậyECPGBộ tiền xử lý sẽ không hiểu phạm vi của các biến thành viên lớp.

Ví dụ, trong trường hợp sau,ECPGTiền xử lý không thể tìm thấy bất kỳ khai báo nào cho biếndbnametrongtestPhương pháp, vì vậy sẽ xảy ra lỗi.

Lớp TestCpp

    EXEC tỷ lệ kèo bóng đá 88 bắt đầu phần khai báo;
    DBName char [1024];
    EXEC tỷ lệ kèo bóng đá 88 END TUYÊN BỐ TUYÊN BỐ;

  công cộng:
    Testcpp ();
    thử nghiệm void ();
    ~ Testcpp ();
;

Testcpp :: testcpp ()

    EXEC tỷ lệ kèo bóng đá 88 kết nối với TestDB1;
    Exec tỷ lệ kèo bóng đá 88 chọn pg_catalog.set_config ('search_path', '', false); Exec tỷ lệ kèo bóng đá 88 cam kết;

Void Test :: test ()

    Exec tỷ lệ kèo bóng đá 88 chọn current_database () vào: dbname;
    printf ("current_database = %s \ n", dbname);

Testcpp :: ~ testcpp ()

    EXEC tỷ lệ kèo bóng đá 88 Ngắt kết nối tất cả;

Mã này sẽ dẫn đến một lỗi như thế này:

ECPG test_cpp.pgctest_cpp.pgc: 28: Lỗi: biến "dbname" không được khai báo

Để tránh vấn đề phạm vi này,testPhương pháp có thể được sửa đổi để sử tỷ lệ kèo bóng đá 88 biến cục bộ làm bộ nhớ trung gian. Nhưng cách tiếp cận này chỉ là một cách giải quyết kém, bởi vì nó tăng lên mã và giảm hiệu suất.

void testcpp :: test ()

    EXEC tỷ lệ kèo bóng đá 88 bắt đầu phần khai báo;
    char tmp [1024];
    EXEC tỷ lệ kèo bóng đá 88 END TUYÊN BỐ TUYÊN BỐ;

    Exec tỷ lệ kèo bóng đá 88 chọn current_database () vào: tmp;
    strlcpy (dbname, tmp, sizeof (tmp));

    printf ("current_database = %s \ n", dbname);

35.13.2. Phát triển ứng tỷ lệ kèo bóng đá 88 C ++ với mô -đun C bên ngoài

Nếu bạn hiểu những hạn chế kỹ thuật này củaECPGBộ tiền xử lý trong C ++, bạn có thể đi đến kết luận rằng liên kết các đối tượng C và các đối tượng C ++ ở giai đoạn liên kết để cho phép các ứng tỷ lệ kèo bóng đá 88 C ++ sử tỷ lệ kèo bóng đá 88 các tính năng ECPG có thể tốt hơn so với việc viết một số lệnh SQL nhúng trong mã C ++ trực tiếp. Phần này mô tả một cách để tách một số lệnh SQL nhúng khỏi mã ứng tỷ lệ kèo bóng đá 88 C ++ với một ví dụ đơn giản. Trong ví dụ này, ứng tỷ lệ kèo bóng đá 88 được triển khai trong C ++, trong khi C và ECPG được sử tỷ lệ kèo bóng đá 88 để kết nối với máy chủ PostgreSQL.

Ba loại tệp phải được tạo: một tệp C (*.pgc), tệp tiêu đề và tệp C ++:

test_mod.pgc

Một mô-đun tuyến phụ để thực thi các lệnh tỷ lệ kèo bóng đá 88 được nhúng trong C. Nó sẽ được chuyển đổi thànhtest_mod.cbởi bộ tiền xử lý.

#include "test_mod.h"
#include <stdio.h

Vô hiệu
db_connect ()

    EXEC tỷ lệ kèo bóng đá 88 kết nối với TestDB1;
    Exec tỷ lệ kèo bóng đá 88 chọn pg_catalog.set_config ('search_path', '', false); Exec tỷ lệ kèo bóng đá 88 cam kết;

Vô hiệu
db_test ()

    EXEC tỷ lệ kèo bóng đá 88 bắt đầu phần khai báo;
    DBName char [1024];
    EXEC tỷ lệ kèo bóng đá 88 END TUYÊN BỐ TUYÊN BỐ;

    Exec tỷ lệ kèo bóng đá 88 chọn current_database () vào: dbname;
    printf ("current_database = %s \ n", dbname);

Vô hiệu
db_disconnect ()

    EXEC tỷ lệ kèo bóng đá 88 Ngắt kết nối tất cả;
test_mod.h

Tệp tiêu đề với các khai báo của các hàm trong mô -đun C (test_mod.pgc). Nó được bao gồm bởitest_cpp.cpp. Tệp này phải cóBên ngoài "C"Khối xung quanh các khai báo, vì nó sẽ được liên kết từ mô -đun C ++.

#ifdef __cplusplus
bên ngoài "c" 
#endif

void db_connect ();
void db_test ();
void db_disconnect ();

#ifdef __cplusplus
test_cpp.cpp

Mã chính cho ứng tỷ lệ kèo bóng đá 88, bao gồmchínhthói quen và trong ví dụ này, một lớp C ++.

#include "test_mod.h"

Lớp TestCpp

  công cộng:
    Testcpp ();
    thử nghiệm void ();
    ~ Testcpp ();
;

Testcpp :: testcpp ()

    db_connect ();

Vô hiệu
Testcpp :: test ()

    db_test ();

Testcpp :: ~ testcpp ()

    db_disconnect ();

int
Main (Void)

    Testcpp *t = new testcpp ();

    t- test ();
    trả lại 0;

Để xây dựng ứng tỷ lệ kèo bóng đá 88, hãy tiến hành như sau. Chuyển thànhtest_mod.pgcthànhtest_mod.cbằng cách chạyECPGvà tạotest_mod.obằng cách biên dịchtest_mod.cVới trình biên dịch c:

16317_16383

Tiếp theo, tạotest_cpp.obằng cách biên dịchtest_cpp.cppVới trình biên dịch C ++:

C ++ -C test_cpp.cpp -o test_cpp.o

Cuối cùng, liên kết các tệp đối tượng này,test_cpp.otest_mod.o, thành một thực thi, sử tỷ lệ kèo bóng đá 88 trình điều khiển trình biên dịch C ++:

C ++ test_cpp.o test_mod.o -lecpg -o test_cpp

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không phù hợp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử tỷ lệ kèo bóng đá 88Mẫu này18219_18283