Specifiche dei collegamenti
Il termine "specifica di collegamento" si riferisce al protocollo per collegare le funzioni o le procedure scritte in linguaggi diversi. Sono interessate le convenzioni di chiamata seguenti:
Distinzione maiuscole/minuscole dei nomi.
Decorazione dei nomi. In C, i nomi dei prefissi del compilatore con un carattere di sottolineatura. Ciò viene spesso denominato "decorazione". In C++, la decorazione dei nomi viene utilizzata per conservare le informazioni sul tipo durante la fase di collegamento. (Vedere Nomi decorati)
L'ordine in cui gli argomenti sono previsti nello stack.
La responsabilità di regolare lo stack durante la restituzione della funzione. La funzione chiamata o la funzione chiamante è responsabile.
Passaggio di argomenti nascosti (in presenza o meno di argomenti nascosti passati).
extern string-literal { declaration-list }
extern string-literal declaration
La specifica di collegamento facilita gradualmente la portabilità del codice C a C++ consentendo l'utilizzo di codice esistente.
Sezione specifica Microsoft
Le uniche specifiche di collegamento attualmente supportate da Microsoft C++ sono "C" e "C++".
Fine sezione specifica Microsoft
Nell'esempio seguente vengono dichiarate le funzioni atoi e atol con il collegamento C:
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
Le chiamate a queste funzioni vengono effettuate tramite il collegamento C. Lo stesso risultato può essere raggiunto utilizzando queste due dichiarazioni:
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Sezione specifica Microsoft
In tutti i file di inclusione standard Microsoft C vengono utilizzate le direttive di compilazione condizionale per rilevare la compilazione C++. Quando viene rilevata una compilazione C++, i prototipi sono racchiusi in una direttiva extern "C" come segue:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
Fine sezione specifica Microsoft
Non è necessario dichiarare le funzioni nei file di inclusione standard come extern "C".
Se una funzione è sottoposta a overload, non più di una delle funzioni con lo stesso nome può avere un identificatore di collegamento. Per ulteriori informazioni, vedere Overload di funzioni.
Nella tabella seguente viene illustrato il funzionamento di varie specifiche di collegamento.
Effetti delle specifiche di collegamento
Specifica |
Effetto |
---|---|
Su un oggetto |
Interessa il collegamento solo di tale oggetto |
Su una funzione |
Interessa il collegamento di quella funzione e tutte le funzioni o oggetti dichiarati in essa |
Su una classe |
Interessa il collegamento di tutte le funzioni non membro e oggetti dichiarati nella classe |
Se una funzione contiene più specifiche di collegamento, queste devono concordare; è un errore dichiarare le funzioni come dotate sia di collegamento C++ che C. Inoltre, se due dichiarazioni per una funzione si verificano in un programma - una con una specifica di collegamento e una senza - la dichiarazione con la specifica di collegamento deve essere specificata per prima. A tutte le dichiarazioni ridondanti di funzioni che hanno già specifiche di collegamento viene fornito il collegamento specificato nella prima dichiarazione. Di seguito è riportato un esempio.
extern "C" int CFunc1();
...
int CFunc1(); // Redeclaration is benign; C linkage is
// retained.
int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
// CFunc2; cannot contain linkage
// specifier.
Funzioni e oggetti dichiarati in modo esplicito come static nel corpo di un identificatore di collegamento composto ({ }) sono considerate come funzioni o oggetti statici; l'identificatore di collegamento viene ignorato. Altre funzioni e oggetti si comportano come se dichiarati con la parola chiave extern. Per informazioni dettagliate sulla parola chiave extern, vedere Utilizzo di estern per specificare un collegamento.