2014-11-07 27 views
7

Come dovrei chiamare una funzione C++ (nessuna classe coinvolta) da un file Swift? Ho provato questo:Chiama una funzione C++ da Swift

In someCFunction.c:

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

void aWrapper() { 
    someCplusplusFunction(); 
} 

In someCpluplusfunction.cpp:

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

In main.swift:

someCFunction(); 
aWrapper(); 

In Bridging-header.h:

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

ho trovato this answer molto informativo, ma ancora non riesco a farlo funzionare. Potrebbe indicarmi la giusta direzione?

Grazie!

risposta

8

Che aspetto ha l'intestazione?

Se si desidera impostare in modo esplicito il tipo di collegamento per funzioni compatibili-C in C++, è necessario dire al compilatore C++ così:

// cHeader.h 

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

Nota che questo non è il codice C valido, in modo da' d è necessario avvolgere le dichiarazioni extern "C" nelle macro del preprocessore.

su OS X e iOS, è possibile utilizzare __BEGIN_DECLS e __END_DECLS intorno codice che si desidera collegato come codice C durante la compilazione di sorgenti C++, e non è necessario preoccuparsi di utilizzare altri trucchi preprocessore per essere codice C valido.

Come tale, sarebbe simile:

// cHeader.h 

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

EDIT: Come ephemer menzionato, è possibile utilizzare le seguenti macro del preprocessore:

// cHeader.h 

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

Grazie! Funziona perfettamente per questo esempio. Xcode continua a non voler collegare il vero progetto, ma continuerò le indagini. – popisar

+0

Ho trovato il problema con il progetto reale: sto provando a passare una stringa come argomento alla funzione C++. Secondo quanto ho letto, una stringa di Swift ** dovrebbe essere automaticamente assegnata a un C ** const char ***, ma suppongo che manchi qualcosa ... – popisar

+0

Se solo ho codificato quello che predico .. Nel mio codice ho mescolato ** const char \ *** e ** char \ ***. Per riprendere: @MaddTheSame ha dato la buona risposta. Niente da aggiungere, ma un ringraziamento :-) – popisar