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 ++?

È stato utile?

Soluzione

extern "C" fa nomi non alterati.

E 'utilizzato quando:

  1. Abbiamo bisogno di utilizzare qualche libreria C in C ++

    extern "C" int foo(int);
    
  2. Abbiamo bisogno di esportare un po 'di codice C ++ a C

    extern "C" int foo(int) { something; }
    
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top