Vorrei sapere dove è meglio mettere ilDove è il posto migliore per mettere il #ifdef __cplusplus extern "C" {#endif
#ifdef __cplusplus
extern "C" {
#endif
in un file di intestazione C.
All'inizio o dopo tutto l'altro include. perché ?
Vorrei sapere dove è meglio mettere ilDove è il posto migliore per mettere il #ifdef __cplusplus extern "C" {#endif
#ifdef __cplusplus
extern "C" {
#endif
in un file di intestazione C.
All'inizio o dopo tutto l'altro include. perché ?
Non ci sono regole rigide su questo, ma si noti quanto segue.
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.
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
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_
O viceversa: per consentire l'uso delle funzioni C all'interno del codice C++ ... – Aconcagua
@Aconcagua che dovrebbe essere curato nelle intestazioni C incluse, ma come ultima risorsa, sì. Ma nel file .cpp, non nell'intestazione. – Offirmo
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
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.
Cosa intendevi per "sono progettati" e "non era design"? – Vincent
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.
Si potrebbe voler abbandonare il termine "C++ nome mangling" nella tua risposta altrimenti chiara –
@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
@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. –
Direi dopo gli include, perché dovresti inserire gli include all'interno di ifdef? –