2014-11-07 3 views
7

Как я могу вызвать функцию C++ (без каких-либо классов) из файла Swift? Я попытался это:Вызов функции C++ из Swift

В someCFunction.c:

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

void aWrapper() { 
    someCplusplusFunction(); 
} 

В someCpluplusfunction.cpp:

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

В main.swift:

someCFunction(); 
aWrapper(); 

В Bridging-header.h:

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

Я нашел this answer очень информативный, но до сих пор я не могу заставить его работать. Не могли бы вы указать мне в правильном направлении?

Спасибо!

ответ

8

Как выглядит заголовок?

Если вы хотите явно задать тип связывания для C-совместимых функций в C++, вы должны сообщить C++ компилятор так:

// cHeader.h 

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

Обратите внимание, что это не правильный код C, так что вы» d необходимо обернуть объявления extern "C" в макросах препроцессора.

На OS X и IOS, вы можете использовать __BEGIN_DECLS и __END_DECLS вокруг кода, который необходимо связать, как код C при компиляции C++ источников, и вам не нужно беспокоиться об использовании других препроцессора фокусов для того, чтобы быть действительным кодом C.

Как таковой, он будет выглядеть так:

// cHeader.h 

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

EDIT: Как ephemer упоминалось, вы можете использовать следующие макросы препроцессора:

// cHeader.h 

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

Спасибо! Он отлично работает для этого примера. Xcode по-прежнему не хочет связывать настоящий проект, но я продолжу расследование. – popisar

+0

Я нашел проблему с реальным проектом: я пытаюсь передать строку в качестве аргумента функции C++. В соответствии с тем, что я читал, Swift ** String ** должен быть автоматически добавлен в C ** const char \ ***, но я полагаю, что мне что-то не хватает ... – popisar

+0

Если бы я закодировал то, что я проповедую .. В моем коде я перепутал ** const char \ *** и ** char \ ***. Для возобновления: @MaddTheSame дал хороший ответ. Нечего добавить, но спасибо :-) – popisar

Смежные вопросы