Passaggio di argomenti e convenzioni di denominazione
Sezione specifica Microsoft
I compilatori di Visual C++ consentono di specificare le convenzioni per passare argomenti e valori restituiti tra funzioni e chiamanti. Non tutte le convenzioni sono disponibili in tutte le piattaforme supportate e alcune convenzioni utilizzano implementazioni specifiche della piattaforma. Nella maggior parte dei casi, le parole chiave o le opzioni del compilatore che specificano una convenzione non supportata su una determinata piattaforma vengono ignorate e viene utilizzata la convenzione predefinita della piattaforma.
Nelle piattaforme x86, tutti gli argomenti vengono estesi a 32 bit quando vengono passati. I valori restituiti vengono estesi anche a 32 bit e vengono restituiti nel registro EAX, eccetto le strutture a 8 byte, che vengono restituite nella coppia di registri EDX:EAX. Le strutture di dimensioni maggiori vengono restituite nel registro EAX come puntatori alle strutture di ritorno nascoste. I parametri vengono inseriti nello stack da destra a sinistra. Le strutture che non sono POD non verranno restituite nei registri.
Il compilatore genera un codice di epilogo e di prologo per salvare e ripristinare i registri ESI, EDI, EBX e EBP, se sono utilizzati nella funzione.
Nota
Quando uno struct, un'unione o una classe vengono restituiti da una funzione per valore, tutte le definizioni del tipo devono essere uguali, altrimenti il programma può avere esito negativo in fase di esecuzione.
Per informazioni su come definire il codice di prologo e di epilogo della funzione, vedere le chiamate alle funzioni naked.
Per informazioni sulle convenzioni di chiamata predefinite nel codice destinato alle piattaforme x64, vedere Cenni preliminari sulle convenzioni di chiamata x64. Per informazioni sui problemi relativi alle convenzioni di chiamata nel codice destinato alle piattaforme ARM, vedere Problemi comuni relativi alla migrazione di Visual C++ ARM.
Le seguenti convenzioni di chiamata sono supportate dal compilatore Visual C/C++.
Parola chiave |
Pulizia dello stack |
Passaggio dei parametri |
---|---|---|
Chiamante |
Inserisce i parametri nello stack in ordine inverso (da destra a sinistra) |
|
n/d |
Carica in ordine i parametri nello stack dell'espressione CLR (da sinistra a destra). |
|
Chiamato |
Inserisce i parametri nello stack in ordine inverso (da destra a sinistra) |
|
Chiamato |
Archiviati nei registri, quindi inseriti nello stack |
|
Chiamato |
Inserito nello stack; questo puntatore è stato archiviato in ECX |
|
Chiamato |
Archiviato nei registri, quindi sottoposto a push nello stack in ordine inverso (da destra a sinistra) |
Per informazioni correlate, vedere le convenzioni di chiamata obsolete.
Fine sezione specifica Microsoft