2014-11-07 15 views
7

Jak wywołać funkcję C++ (bez udziału klasy) z pliku Swift? Próbowałem to:Wywołanie funkcji C++ od Swift

W someCFunction.c:

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

void aWrapper() { 
    someCplusplusFunction(); 
} 

W someCpluplusfunction.cpp:

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

W main.swift:

someCFunction(); 
aWrapper(); 

W pomostowe header.h:

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

znalazłem this answer bardzo pouczające, ale nadal nie mogę tego dokonać. Czy możesz wskazać mi właściwy kierunek?

Dzięki!

Odpowiedz

8

Jak wygląda nagłówek?

Jeśli chcesz jawnie ustawić typ łączenia różnych C-kompatybilnych funkcji w C++, trzeba powiedzieć, że kompilator C++ tak:

// cHeader.h 

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

Zauważ, że nie jest to prawidłowy kod C, dzięki czemu” d musi zawinąć deklaracje extern "C" w makrach preprocesora.

W systemach OS X i iOS można używać __BEGIN_DECLS i __END_DECLS wokół kodu, który ma być połączony jako kod C podczas kompilowania źródeł C++, i nie trzeba się martwić o używanie innych sztuczek preprocesora, aby był to poprawny kod C.

Jako takie, to będzie wyglądać:

// cHeader.h 

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

EDIT: Jak ephemer wspomniano, można użyć następujących makr preprocesora:

// cHeader.h 

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

Dziękujemy! Działa to doskonale na ten przykład. Xcode nadal nie chce połączyć rzeczywistego projektu, ale będę kontynuować dochodzenia. – popisar

+0

Znalazłem problem z rzeczywistym projektem: Próbuję przekazać ciąg jako argument do funkcji C++. Zgodnie z tym, co przeczytałem, ciąg ** Swift ** powinien być automatycznie rzucany na C ** const char \ ***, ale przypuszczam, że brakuje mi czegoś ... – popisar

+0

Gdybym tylko zakodował to, co głosiłem ... W moim kodzie pomieszałem ** const char \ *** i ** char \ ***. Aby wznowić: @MaddTheSame dał dobrą odpowiedź. Nic dodać, ale podziękowania :-) – popisar