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
Trả lời
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:
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.
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ở.
Đ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.
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.
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)
Đ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.
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);
}
Có lẽ đáng đọc bài này: http://stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code –
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.
- 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ỏ
- 1. Chuyển đổi từ con trỏ C++/CLI sang con trỏ C++ bản địa
- 2. Chuyển con trỏ từ C++ sang Python/w tăng python?
- 3. Chuyển con trỏ cấu trúc C sang tập lệnh lua
- 4. Gọi C++ con trỏ hàm từ C#
- 5. chuyển đổi ẩn của con trỏ gián tiếp sang con trỏ mục tiêu-c bằng ARC
- 6. Ý nghĩa của con trỏ trỏ tới con trỏ trong C và trong C++ là gì?
- 7. Chuỗi và con trỏ C++
- 8. con trỏ c và mảng
- 9. PHP tới C# và ngược lại
- 10. C# chuyển đổi số nguyên thành hex và ngược lại
- 11. Có thể chuyển một tham chiếu đến một con trỏ từ Excel VBA sang C++ không?
- 12. Con trỏ hàm và gọi lại trong C
- 13. Chuyển con trỏ giữa C và Java qua JNI
- 14. char * con trỏ từ chuỗi trong C#
- 15. Làm cách nào để chuyển đổi Xml sang Json và ngược lại trong C#
- 16. Chuyển sang C++ 0x từ C++ 98
- 17. Trả về con trỏ từ hàm C
- 18. C con trỏ Câu
- 19. C++ typecast: đúc một con trỏ từ con trỏ void đến con trỏ lớp
- 20. Chuyển đổi từ C++ sang Java
- 21. Chuyển đổi từ điểm nổi của IBM sang tiêu chuẩn điểm nổi IEEE và ngược lại trong C#?
- 22. Điều khiển bajs (từ TrackBall sang FlyControls và ngược lại)
- 23. C# con trỏ, vòng lặp và generics
- 24. phạm vi và C++ con trỏ
- 25. C++ vector với con trỏ
- 26. Con trỏ C++ trỏ đến Java
- 27. Chuyển đổi nhiều PDF sang PNG và ngược lại (Linux)
- 28. Chuyển đổi màu hex sang RGB và ngược lại
- 29. Từ lực đẩy :: device_vector đến con trỏ thô và ngược lại?
- 30. con trỏ Void trong C++
Đó 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. –