2011-10-07 31 views
13

Tôi muốn sử dụng Dữ liệu thuần túy làm công cụ tạo mẫu cho thư viện của riêng mình. Tôi phát hiện ra rằng các bản vá của Pure Data được viết bằng C, nhưng thư viện của tôi được viết bằng C++. Vậy làm thế nào tôi có thể sử dụng mã này trong dữ liệu thuần túy? Vì tôi đã không sử dụng đồng bằng C, tôi muốn biết làm thế nào tôi có thể viết một wrapper C cho các lớp C + + và làm thế nào để nhanh chóng các lớp học của tôi sau đó? Hay tôi phải viết lại mọi thứ trong C?C Trình bao bọc cho C++

+5

Hơi muộn, nhưng tôi đã viết một howto nhỏ về C wrapper cho C++: http://www.teddy.ch/c++_library_in_c/ – Teddy

Trả lời

21

Bạn sẽ cần phải viết chức năng wrapper cho mỗi chức năng mà cần phải được gọi Ví dụ:!.

// The C++ implementation 
class SomeObj { void func(int); }; 

extern "C" { 
    SomeObj* newSomeObj() {return new SomeObj();} 
    void freeSomeObj(SomeObj* obj) {delete obj;} 
    void SomeObj_func(SomeObj* obj, int param) {obj->func(param)} 
} 

// The C interface 
typedef struct SomeObjHandle SomeObj; 

SomeObj* newSomeObj(); 
void freeSomeObj(SomeObj* obj); 
void SomeObj_func(SomeObj* obj, int param); 

Lưu ý thi s phải là mã C++. extern "C" chỉ định rằng hàm sử dụng các quy ước đặt tên C.

+6

Thay vì sử dụng 'void *' bạn nên sử dụng cấu trúc không hoàn chỉnh để đạt được một số loại an toàn. –

+1

Để giúp hiểu rõ hơn, 'extern" Linkage_Specification "{// code}' Bằng cách này, ta sẽ nói cho trình biên dịch đặc tả liên kết để sử dụng trong khi liên kết mã. –

+0

Tôi không chắc chắn tôi hiểu rõ ví dụ của bạn. Nếu tôi khai báo những hàm "C" bên ngoài trong tiêu đề C++ của tôi, tại sao tôi phải khai báo lại nó trong C? Tôi không thể chỉ bao gồm tiêu đề C++ trong tệp C của tôi và gọi trực tiếp các chức năng? – Pedro

1

Bạn hoàn toàn có thể gọi C từ C++ - không vấn đề gì!

Trường hợp xấu nhất, bạn có thể phải khai báo rõ ràng các hàm bạn gọi từ Dữ liệu thuần túy là "extern C". Nhưng đó là gần như chắc chắn rằng dữ liệu tinh khiết đã làm điều đó cho bạn (có lẽ bạn sẽ thấy "extern C" trong các tập tin tiêu đề dữ liệu tinh khiết

Dưới đây là thông tin thêm:.

http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx

'Hy vọng rằng giúp

+0

Tôi nghĩ từ Q OP muốn gọi C++ từ C, không phải là Đi đường vòng khác. –

+0

Tôi muốn sử dụng nó theo cách khác: gọi C++ từ c. – Pedro

+0

Nhưng có lẽ dữ liệu thuần túy, bất kể nó là gì, chỉ biết về C. –

2

Hãy để tôi nói một cách khác:

1) Bạn có thể gọi C chức năng, dữ liệu và thư viện từ ++ nguồn C, và bạn gọi C++ nguồn từ C.

2) Bất cứ khi nào C gọi vào C++ nguồn tuy nhiên, nguồn đó phải được viết bằng một tập con C của C++.

3) Một phần trong số này đang sử dụng "extern C".

4) phần khác là sử dụng "#ifdef __cplusplus"

5) Các liên kết tôi trích dẫn ở trên cung cấp cho rất nhiều chi tiết

6) Tôi nhìn Pure Data site. Bạn có thể phải thực hiện một số "chỉnh sửa" cho thư viện của mình. Bạn có thể muốn tạo một tiêu đề mới. Nhưng về cơ bản, tôi nghĩ bạn có thể hoàn thành mục tiêu của mình để đưa thư viện của bạn tích hợp với Dữ liệu thuần túy.

IMHO ...

2

Bạn cũng có thể viết đối tượng cho Dữ liệu thuần sử dụng C++ bằng cách sử dụng flext framework.

Các vấn đề liên quan