Quando si compila un file sorgente C
in un file oggetto, i nomi delle funzioni nel file oggetto verranno decorati. Ogni convenzione di chiamata avrà una decorazione diversa.
Ad esempio, la seguente funzione __stdcall
:
void __stdcall stdcallFunction(int i)
{
int j = 12345;
}
Saranno decorati in questo modo nel file oggetto:
_stdcallFunction@4
E la seguente funzione __cdecl
:
void __cdecl cdeclFunction(int i)
{
int j = 12345;
}
Saranno decorati in questo modo nel file oggetto:
_cdeclFunction
Ora la mia domanda è: perché viene usata la decorazione del nome? Voglio dire, perché la funzione stdcallFunction
non viene salvata nel file oggetto semplicemente come stdcallFunction
e non come _stdcallFunction@4
?
Penso che la ragione sia la seguente:
Dire che ho creato una libreria (una libreria .lib
e non una libreria .c
) che contiene le due funzioni precedenti.
Ora voglio chiamare la funzione stdcallFunction
in questa libreria dal mio file sorgente C, farei quanto segue:
void __stdcall stdcallFunction(int i);
stdcallFunction(123);
Questo compilerà bene. Ma se ho fatto quanto segue (ha cambiato la convenzione di chiamata per la dichiarazione di funzione):
void __cdecl stdcallFunction(int i);
stdcallFunction(123);
Quindi questo produrrà un errore di compilazione.
Quindi il motivo per usare la decorazione del nome è per il compilatore assicurarsi che io stia usando la convenzione di chiamata corretta quando chiami una funzione che esiste in una libreria (la decorazione del nome è semplicemente un'indicazione di quale sia la convenzione di chiamata di un funzione in una libreria).
Sono corretto?