Condividi tramite


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.

Vedi anche

Errore degli strumenti del linker LNK2001