Condividi tramite


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.

Vedere anche

Riferimenti

Utilizzo di extern per specificare un collegamento