2014-11-07 25 views
7

Làm cách nào để gọi hàm C++ (không có lớp nào liên quan) từ tệp Swift? Tôi cố gắng này:Gọi hàm C++ từ Swift

Trong someCFunction.c:

void someCFunction() { 
    printf("Inside the C function\n"); 
} 

void aWrapper() { 
    someCplusplusFunction(); 
} 

Trong someCpluplusfunction.cpp:

void someCplusplusFunction() { 
    printf("Inside the C++ function"); 
} 

Trong main.swift:

someCFunction(); 
aWrapper(); 

Trong Bridging-Header.h:

#import "someCFunction.h" 
#import "someCplusplusFunction.h" 

tôi thấy this answer rất nhiều thông tin, nhưng tôi vẫn không thể làm cho nó làm việc. Bạn có thể chỉ cho tôi đúng hướng không?

Cảm ơn!

Trả lời

8

Tiêu đề trông như thế nào?

Nếu bạn muốn thiết lập một cách rõ ràng các loại liên kết cho các chức năng C-tương thích trong C++, bạn cần phải nói với C++ biên dịch như vậy:

// cHeader.h 

extern "C" { 
    void someCplusplusFunction(); 
    void someCFunction(); 
    void aWrapper(); 
} 

Lưu ý rằng đây không phải là mã C có giá trị, vì vậy bạn' d cần phải bọc các tờ khai extern "C" trong các macro tiền xử lý.

Trên OS X và iOS, bạn có thể sử dụng __BEGIN_DECLS__END_DECLS xung quanh mã bạn muốn liên kết dưới dạng mã C khi biên dịch nguồn C++ và bạn không cần phải lo lắng về việc sử dụng thủ thuật tiền xử lý khác để mã đó hợp lệ.

Như vậy, nó sẽ trông giống như:

// cHeader.h 

__BEGIN_DECLS 
void someCplusplusFunction(); 
void someCFunction(); 
void aWrapper(); 
__END_DECLS 

EDIT: Như ephemer đề cập, bạn có thể sử dụng các macro tiền xử lý như sau:

// cHeader.h 

#ifdef __cplusplus 
extern "C" { 
#endif 
void someCplusplusFunction(); 
void someCFunction(); 
void aWrapper(); 
#ifdef __cplusplus 
} 
#endif 
+0

Cảm ơn bạn! Nó hoạt động hoàn hảo cho ví dụ này. Xcode vẫn không muốn liên kết dự án thực, nhưng tôi sẽ tiếp tục điều tra. – popisar

+0

Tôi đã tìm thấy sự cố với dự án thực: Tôi đang cố chuyển một chuỗi làm đối số cho hàm C++. Theo những gì tôi đọc, một chuỗi Swift ** ** sẽ được tự động đúc thành một C ** const char \ ***, nhưng tôi cho rằng tôi đang thiếu một cái gì đó ... – popisar

+0

Nếu chỉ tôi mã hóa những gì tôi giảng .. Trong mã của tôi, tôi trộn lên ** const char \ *** và ** char \ ***. Để tiếp tục: @MaddTheSame đã đưa ra câu trả lời hay. Không có gì để thêm, nhưng một lời cảm ơn :-) – popisar

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