Quando usare extern “C” in C ++? [duplicare]
Domanda
Eventuali duplicati:
Perché abbiamo bisogno di extern “C” {# includere} in C ++?
Ho visto spesso programmi codificati come:
extern "C" bool doSomeWork() {
//
return true;
}
Perché utilizziamo un blocco extern "C"
? Possiamo sostituirlo con qualcosa in C ++? C'è qualche vantaggio di utilizzare extern "C"
?
Lo faccio vedere un link che spiega questo ma perché abbiamo bisogno di compilare qualcosa in C quando abbiamo già C ++?
Soluzione
extern "C" fa nomi non alterati.
E 'utilizzato quando:
-
Abbiamo bisogno di utilizzare qualche libreria C in C ++
extern "C" int foo(int);
-
Abbiamo bisogno di esportare un po 'di codice C ++ a C
extern "C" int foo(int) { something; }
-
Abbiamo bisogno di una capacità di risolvere simbolo nella libreria condivisa - quindi abbiamo bisogno di sbarazzarsi pressare
extern "C" int foo(int) { something; } /// typedef int (*foo_type)(int); foo_type f = (foo_type)dlsym(handle,"foo")
Altri suggerimenti
Un luogo in cui extern "C" ha senso è quando si sta collegando a una libreria che è stato compilato come codice C.
extern "C" {
#include "c_only_header.h"
}
In caso contrario, si potrebbe ottenere errori del linker perché la libreria contiene le funzioni con C-linkage (_myfunc), ma il compilatore C ++, che ha esaminato l'intestazione della biblioteca come codice C ++, generato ++ nomi dei simboli C per le funzioni ( "_myfunc @ XAZZYE" -. questo è chiamato mangling e diverso per ogni compilatore)
Un altro luogo dove viene utilizzato extern "C" è quello di garantire il collegamento C anche per funzioni scritte in C ++, ad es.
extern "C" void __stdcall PrintHello() {
cout << "Hello World" << endl;
}
Tale funzione può essere esportato in una DLL e sarà quindi richiamabile da un altro linguaggio di programmazione in quanto la compilazione non storpiare il suo nome. Se è stato aggiunto un altro di sovraccarico della stessa funzione, ad es.
extern "C" void __stdcall PrintHello() {
cout << "Hello World" << endl;
}
extern "C" void __stdcall PrintHello(const char *name) {
cout << "Hello, " << name << endl;
}
La maggior parte dei compilatori sarebbe poi prendere questo, e quindi impedire l'utilizzo sovraccarichi funzionali nel proprio funzioni DLL-pubblico.