2013-04-18 11 views

risposta

9

Non ci sono regole rigide su questo, ma si noti quanto segue.

  1. Il principio generale è che ogni file di intestazione si prende cura di sé (ed è autosufficiente). Quindi, con questo principio, non sarebbe necessario avvolgere i file di intestazione in una "C" esterna, poiché i file di intestazione avrebbero una "C" esterna in essi (se ne hanno bisogno). Quindi, nel file corrente, lo posizionerai dopo che l'altro include.
  2. Ma se si dispone di un intero gruppo di intestazioni, che non si desidera aggiungere una "C" esterna, e si desidera rendere disponibile attraverso una singola inclusione, con tutti i mezzi, andare avanti e avvolgerle in un file largo extern "C".

Basta sapere che l'idea dietro "C" extern è che fa sì che il compilatore generi il collegamento C amichevole. Altrimenti, il codice compilato con un compilatore C++ cerca i nomi storti a cui collegarsi negli archivi compilati con un compilatore C e non li trova.

+0

Un terzo esempio: in realtà, ci sono librerie C l'autore del quale non si preoccupava di C++ e lasciava semplicemente la roba "C" extern. Vorresti piuttosto modificare le intestazioni straniere o includere le intestazioni non modificate avvolte dal tuo "extern" C ""? Personalmente preferisco quest'ultimo ... – Aconcagua

9

Questo costrutto è usato per fare le vostre nomi a disposizione di un linker C (breve spiegazione)

Così, ovviamente, che si desidera utilizzare in giro solo la tua roba.

Ti piace questa:

#ifndef MY_INCLUDE_H_ // include guard 
#define MY_INCLUDE_H_ 

#include <...> // dependencies 
#include "..." 

#ifdef __cplusplus 
extern “C” { 
#endif 

// ... your types, methods, variables 

#ifdef __cplusplus 
} 
#endif 

#endif // MY_INCLUDE_H_ 
+0

O viceversa: per consentire l'uso delle funzioni C all'interno del codice C++ ... – Aconcagua

+0

@Aconcagua che dovrebbe essere curato nelle intestazioni C incluse, ma come ultima risorsa, sì. Ma nel file .cpp, non nell'intestazione. – Offirmo

+0

Bene, anche il thread è taggato 'C', quindi da questo punto di vista, il tuo esempio potrebbe anche essere stato un header C - a meno che tu non abbia incluso qualche intestazione esplicativa C++ o usato un codice C++ esclusivo ... – Aconcagua

1

extern "C" influenza il modo in cui il codice viene compilato. Le intestazioni che sono progettate per il da compilare sia come C che come C++ gestiranno direttamente extern "C". È necessario mai incorporare una direttiva #include in un blocco extern "C": se l'intestazione in questione è stata progettata per essere compilata in entrambi i modi, la direttiva è ridondante e se non è stata progettata per essere utilizzata in entrambi i modi si tratta di un errore.

+0

Cosa intendevi per "sono progettati" e "non era design"? – Vincent

1
  • extern "C" influisce sul collegamento. Quando le funzioni del C++ sono compilate, i loro nomi cambiano, ecco perché è possibile sovraccaricare in C++. Quindi, il nome della funzione viene modificato in base al tipo e al numero di parametri, quindi due funzioni con lo stesso nome avranno due diversi nomi di simboli.

  • Il codice all'interno di una "C" esterna è ancora codice C++. Esistono limitazioni su cosa è possibile fare in un blocco "C" esterno, ma riguardano esclusivamente il collegamento.

+0

Si potrebbe voler abbandonare il termine "C++ nome mangling" nella tua risposta altrimenti chiara –

+0

@Jaap Versteegh Perché lasciare cadere il termine che è il termine usato per identificare questo tipo di comportamento? Se qualcuno vuole leggere di più su ciò che sta accadendo e perché, questo è il termine che dovrebbero usare per cercare maggiori informazioni. – hobb

+0

@hobb intendevo dire "drop in" come in "add". Il nome mangling non era * menzionato * nella risposta e come dici tu, questo è il nome per questo comportamento. –

Problemi correlati