Decorazione dei nomi
La decorazione dei nomi in genere fa riferimento alle convenzioni di denominazione di C++, ma può essere applicata anche a diversi casi di C. Per impostazione predefinita, C++ usa il nome della funzione, i parametri e il tipo restituito per creare un nome linker per la funzione. Si consideri la dichiarazione di funzione seguente:
void CALLTYPE test(void);
La seguente tabella mostra il nome linker per diverse convenzioni di chiamata.
Convenzione di chiamata | extern "C" o .c file |
.cpp , .cxx o /TP |
---|---|---|
Convenzione di denominazione C (__cdecl ) |
_test |
?test@@ZAXXZ |
Convenzione di denominazione delle chiamate rapide (__fastcall ) |
@test@0 |
?test@@YIXXZ |
Convenzione di denominazione delle chiamate standard (__stdcall ) |
_test@0 |
?test@@YGXXZ |
Convenzione di denominazione delle chiamate vettoriali (__vectorcall ) |
test@@0 |
?test@@YQXXZ |
Usare extern "C"
per chiamare una funzione C da C++. extern "C"
forza l'uso della convenzione di denominazione C per le funzioni C++ non di classe. Tenere presente le opzioni del compilatore /Tc o /Tp, che indicano al compilatore di ignorare l'estensione del nome file e compilare il file rispettivamente come C o C++. Queste opzioni possono causare nomi di linker non previsti.
Questo errore può essere causato anche da prototipi di funzione con parametri non corrispondenti. La decorazione dei nomi incorpora i parametri di una funzione nel nome funzionale decorato finale. La chiamata di una funzione con i tipi di parametro che non corrispondono a quelli nella dichiarazione di funzione può anche causare LNK2001.
Attualmente non esistono standard per la denominazione C++ tra i fornitori del compilatore o anche tra versioni diverse di un compilatore. Il collegamento di file oggetto compilati da altri compilatori potrebbe non produrre lo stesso schema di denominazione e può causare esterni non risolti.