2010-01-16 44 views
5

Có mẹo nào có thể cho tôi biết về việc truyền con trỏ tới cấu trúc, nhân đôi, hàm, ... từ chương trình C sang thư viện C++ và ngược lại không?chuyển con trỏ từ C sang C++ và ngược lại

+3

Đó là một câu hỏi hay nói chung, tuy nhiên, đưa ra một trường hợp ví dụ sử dụng, nơi bạn có câu hỏi cụ thể hơn sẽ giúp cộng đồng cho những lời khuyên tốt nhất. –

Trả lời

10

Giả sử bạn đang mã hóa này trong hai thư viện khác nhau tĩnh hoặc động (DLL trên cửa sổ thư viện chia sẻ trên Linux và * nix biến thể khác) Các mối quan tâm lớn nhất mà tôi có như sau:

  1. Chúng được biên dịch cùng trình biên dịch. Trong khi điều này là không cần thiết nếu tất cả các xuất khẩu C++ được xuất khẩu với một quy ước đặt tên kiểu C, nó là cần thiết cho C++ để gọi C++ cho các cá thể lớp giữa hai mô-đun C++. Điều này là cần thiết do làm thế nào khác nhau trình biên dịch mangle C++ xuất khẩu khác nhau.

  2. Không bỏ lớp C++ dưới dạng cấu trúc C. Chúng không giống nhau dưới bìa, ngay cả khi bố cục của các trường giống nhau. Các lớp C++ có một "bảng v" nếu chúng có bất kỳ thành viên ảo nào; bảng v này cho phép gọi đúng phương thức thừa kế hoặc lớp cơ sở.

  3. Điều này đúng với C đến C hoặc C++ thành C++ cũng như C thành C++. Đảm bảo cả hai đều sử dụng cùng một liên kết byte cho thư viện đầu ra. Bạn chỉ có thể xác định điều này bằng cách đọc tài liệu về trình biên dịch hoặc môi trường phát triển của bạn.

  4. Không trộn malloc/miễn phí với mới/xóa. Cụ thể hơn là không cấp phát bộ nhớ với bộ nhớ mới và miễn phí với "miễn phí" và ngược lại. Nhiều trình biên dịch và hệ điều hành xử lý việc quản lý bộ nhớ khác nhau giữa hai hệ điều hành.

  5. Chuyển con trỏ hàm: Miễn là chúng được tiếp xúc với/từ C++ là '' bên ngoài "C" '', điều này sẽ ổn. (Bạn sẽ cần tham khảo tài liệu trình biên dịch của bạn về cách xác định khi một tiêu đề đang được biên dịch như C hoặc C++ để duy trì điều này trong một tệp, hoặc bạn sẽ cần hai bản sao riêng biệt của khai báo hàm tương tự trong mỗi dự án - I giới thiệu đầu tiên)

  6. Đi gấp đôi: Đây là loại được tích hợp trong cả C và C++ và phải được xử lý giống nhau.

  7. Nếu bạn phải chia sẻ một thể hiện của đối tượng C++ với hàm C, và hành động trên nó trong mã C, hãy trưng ra một tập hợp các hàm trợ giúp xuất C, gọi các phương thức thích hợp trên đối tượng C++. Mã C thuần túy không thể gọi đúng phương thức trên các đối tượng C++.

 

    Pseudocode-ish Example: 
    // C++ class 
    class foo { 
     public: 
      void DoIt(); 
    }; 

    // export helper declarations 
    extern "C" void call_doit(foo* pFoo); 
    extern "C" foo* allocate_foo(); 
    extern "C" deallocate_foo(foo* pFoo); 


    // implementation 
    void call_doit(foo* pFoo) 
    { 
     pFoo->DoIt(); 
    } 

    foo* allocate_foo() 
    { 
     return new foo(); 
    } 

    deallocate_foo(foo* pFoo) 
    { 
     delete pFoo; 
    } 

    // c consumer 
    void main() 
    { 
     foo* pFoo= allocate_foo(); 
     call_doit(pFoo); 
     dealocate_foo(pFoo); 
    } 

 
+0

Có lẽ đáng đọc bài này: http://stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code –

0

Con trỏ C và C++ giống nhau - con trỏ về cơ bản trỏ đến một khối bộ nhớ và không thay đổi từ C/C++.

Bạn muốn cẩn thận khi không vượt qua các loại đống - ví dụ: không phân bổ trong một thư viện và không cấp phát trong thư viện có thể có một vùng khác hoặc đang sử dụng phiên bản thời gian chạy khác (hoặc ngược lại) .

Ý của bạn là hỏi về các vấn đề xung quanh giá trị theo từng giá trị hoặc thông qua tham chiếu? Nó có thể giúp cung cấp một câu hỏi cụ thể hơn.

+0

Điều gì về con trỏ để hoạt động? – adk

+0

con trỏ đến hàm (không phải phương thức) là giống nhau trong C++ như trong C. Tuy nhiên, bạn phải xác định chúng bằng 'extern" C "' để không có chúng bị cắt xén – psychotik

0
  • không quên extern "C" từ khóa để vấn đề tránh với C++ mangling tên.
  • Dont sử dụng vượt qua theo loại lập luận tài liệu tham khảo nhưng con trỏ
Các vấn đề liên quan