Bạn sẽ cần phải "quấn" C++ giao diện của bạn với chức năng C thường xuyên mà phải mất một tham số để chỉ ra những gì đối tượng họ sẽ được gọi. Ví dụ, nếu bạn có trong C++
class A
{
// .. boilerplate stuff...
int SomeMethod(int n, float f);
};
Sau đó, cùng với nó, bạn có thể khai báo một chức năng như
extern "C" int A_SomeMethod(void* Obj, int n, float f)
{
return(((A*)Obj)->SomeMethod(n, f));
}
Nếu bạn không thoải mái với những đúc của void *, bạn có thể triển khai một số loại bản đồ từ một xử lý mờ đến A*
. Nhưng ý chính là bạn sẽ cần phải giữ một số xử lý/con trỏ tới đối tượng mà phương thức sẽ được gọi. Để có được con trỏ/xử lý bạn sẽ cần phải quấn phân bổ đến:
extern "C" void* A_Instantiate()
{
return new A;
}
C++ file nên được biên dịch riêng rẽ cùng với các tập tin với các chức năng trên. Một bao gồm riêng biệt cho việc biên dịch C nên bao gồm các khai báo của tất cả các hàm ở trên.
CHỈNH SỬA: Các lưu ý và ý kiến dưới đây rất quan trọng; để trả lời câu hỏi, "Có, có thể gọi C++ từ C", và đây là một cách tiếp cận. Nó không phải là một cách tiếp cận hoàn chỉnh vì không thực sự là một cách cơ học để làm điều đó, nhưng đó là một sự khởi đầu. Ngoài ra, đừng quên tạo một cuộc gọi khác cho delete
, v.v.
Cảm ơn wilsonmichaelpatrick, nhưng những gì về việc sử dụng * Biên dịch * C + + mã trong chương trình C của tôi ?! – S0H31L
'A' được sử dụng khi đúc' Obj' ?! Nó là một loại được xác định trước hay cấu trúc ?! – S0H31L
'A' là loại lớp C++. Ngay cả với mã C++ đã biên dịch, phương pháp này cũng có tác dụng. Tất cả những gì bạn cần làm là định nghĩa các phương thức "C" bên ngoài dọc theo các dòng mà tôi đã mô tả ở trên và sử dụng các phương thức đó để gọi đến mã C++ của bạn. Bản thân mã C++ không được thay đổi. – wilsonmichaelpatrick