Passaggio di argomenti e convenzioni di denominazione
Sezione specifica Microsoft
I compilatori Microsoft C++ consentono di specificare convenzioni per il passaggio di 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 ampliati 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 prologo e l'epilogo della funzione personalizzati, vedere Chiamate a funzioni naked.
Per informazioni sulle convenzioni di chiamata predefinite nel codice destinato alle piattaforme x64, vedere x64 Calling Convention. Per informazioni sui problemi relativi alle convenzioni di chiamata nel codice destinato alle piattaforme ARM, vedere Problemi comuni di migrazione arm di Visual C++.
Le seguenti convenzioni di chiamata sono supportate dal compilatore Visual C/C++.
Parola chiave | Pulizia dello stack | Passaggio dei parametri |
---|---|---|
__cdecl | Chiamante | Inserisce i parametri nello stack in ordine inverso (da destra a sinistra) |
__clrcall | n/d | Carica in ordine i parametri nello stack dell'espressione CLR (da sinistra a destra). |
__stdcall | Chiamato | Inserisce i parametri nello stack in ordine inverso (da destra a sinistra) |
__fastcall | Chiamato | Archiviati nei registri, quindi inseriti nello stack |
__thiscall | Chiamato | Spinto sullo stack; this puntatore archiviato in ECX |
__vectorcall | Chiamato | Archiviato nei registri, quindi sottoposto a push nello stack in ordine inverso (da destra a sinistra) |
Per informazioni correlate, vedere Convenzioni di chiamata obsolete.
Fine sezione specifica Microsoft
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per