Notes d'étude C / C ++: Méthodes d'appel de fonction C / C ++, vous devriez apprendre ces cinq

Cet article résume et présente en détail plusieurs méthodes d'appel de fonction C / C ++. Les amis dans le besoin peuvent venir s'y référer, en espérant que cela sera utile à tout le monde.

 

Lors de l'appel d'une fonction, l'ordinateur utilise souvent une pile pour stocker les paramètres passés à la fonction.

La pile est une structure de données premier entré-dernier sorti. La pile a une zone de stockage et un pointeur de haut de pile. Le pointeur du haut de la pile pointe vers le premier élément de données disponible sur la pile (appelé le haut de la pile). L'utilisateur peut ajouter des données à la pile en haut de la pile. Cette opération s'appelle Pousser. Une fois la pile poussée, le haut de la pile devient automatiquement l'emplacement de l'élément de données nouvellement ajouté et le pointeur en haut de la pile est également modifiée en conséquence. L'utilisateur peut également retirer le haut de la pile de la pile, ce que l'on appelle un pop. Après avoir fait sauter la pile, un élément sous le haut de la pile devient le haut de la pile et le pointeur du haut de la pile est modifié en conséquence. Lorsqu'une fonction est appelée, l'appelant pousse séquentiellement les paramètres sur la pile, puis appelle la fonction. Une fois la fonction appelée, les données sont obtenues à partir de la pile et les calculs sont effectués. Une fois le calcul de la fonction terminé, l'appelant ou la fonction elle-même modifie la pile pour restaurer la pile d'origine.

Lors du passage des paramètres, deux problèmes importants doivent être clairement énoncés:

1. Lorsqu'il y a plus d'un paramètre, dans quel ordre les paramètres seront-ils poussés sur la pile;

2. Une fois la fonction appelée, qui restaurera la pile à son état d'origine.

Dans les langages de haut niveau, ces deux problèmes s'expliquent par la manière d'appeler les fonctions.

 

Ce qui suit décrit ces méthodes d'appel:

1. stdcall

La méthode d'appel stdcall est également appelée méthode d'appel Pascal. Dans le compilateur C / C ++ de la série Microsoft C ++, utilisez la macro PASCAL, la macro WINAPI et la macro CALLBACK pour spécifier la méthode d'appel de fonction comme stdcall.

La déclaration de fonction de la méthode d'appel stdcall est:

fonction int _stdcall (int a, int b);

La méthode d'appel de stdcall signifie:

(1) Les paramètres sont poussés dans la pile une fois de droite à gauche

(2) Restaurer la pile par la fonction appelée elle-même

(3) Le nom de la fonction est automatiquement ajouté avec un trait de soulignement, suivi d'un @, suivi de la taille du paramètre

La fonction ci-dessus traduite en langage d'assemblage deviendra:

pousser b d'abord pousse le second paramètre

appuyez sur a puis appuyez sur le premier paramètre

fonction d'appel fonction d'appel

Au moment de la compilation, le nom de cette fonction est traduit par _function @ 8

2. cdecl

La méthode d'appel cdecl est également appelée méthode d'appel C, qui est la méthode d'appel par défaut du langage C. Sa syntaxe est la suivante:

int function (int a, int b) // Aucun modificateur n'est la méthode d'appel C

int _cdecl function (int a, int b) // spécifie clairement la méthode d'appel C

La méthode d'appel de cdecl détermine:

(1) Les paramètres sont poussés tour à tour sur la pile de droite à gauche

(2) La pile est restaurée par l'appelant

(3) Le nom de la fonction ajoute automatiquement un trait de soulignement

Puisque l'appelant restaure la pile, la méthode d'appel C permet au nombre de paramètres de fonction d'être variable, ce qui est une caractéristique majeure du langage C.

La fonction de cette manière se traduit par:

push b // pousser le deuxième paramètre en premier

push a // pousse le premier paramètre

call funtion // fonction d'appel

add esp, 8 // Nettoie la pile

Au moment de la compilation, la fonction de cette manière est traduite en: _function

3. appel rapide

Fastcall peut être connu d'après son nom, c'est une méthode d'appel rapide. Les premier et deuxième paramètres DWORD de la fonction de cette manière sont passés par ecx et edx,

Les paramètres suivants sont poussés sur la pile de droite à gauche.

La fonction appelée nettoie la pile.

Les règles de modification de nom de fonction sont les mêmes que stdcall

La syntaxe de la déclaration est:

int fonction fastcall (int a, int b);

4. cet appel

Cette méthode d'appel est le seul modificateur qui ne peut pas être affiché. Il s'agit de la méthode d'appel par défaut des fonctions membres de la classe C ++. Étant donné que les appels de fonction membre ont également un pointeur this, cette méthode d'appel spéciale doit être utilisée.

Cette méthode d'appel signifie:

Les paramètres sont poussés sur la pile de droite à gauche.

Si le nombre de paramètres est déterminé, le pointeur this est passé à l'appelé via ecx; si le nombre de paramètres est incertain, le pointeur this est poussé sur la pile après que tous les paramètres ont été poussés sur la pile.

Si le nombre de paramètres est indéfini, l'appelant nettoie la pile, sinon la fonction nettoie la pile.

On peut voir que pour le nombre fixe de paramètres, il est similaire à stdcall, et il est similaire à cdecl quand ce n'est pas le cas.

5. appel nu

C'est une méthode d'appel relativement rare, qui n'est pas courante dans les langages de programmation généraux de haut niveau.

La méthode d'appel déclarée de la fonction doit être cohérente avec la méthode d'appel réelle, ce qui entraînera inévitablement une confusion dans le compilateur.

Règles de modification du nom de la fonction:

1. Règles de convention de modification de nom de fonction lors de la compilation C:

La convention d'appel __stdcall est précédée d'un trait de soulignement devant le nom de la fonction de sortie, suivi d'un symbole «@» et du nombre d'octets de ses paramètres, au format _function @ 8.

La convention d'appel __cdecl préfixe uniquement le nom de la fonction de sortie avec un trait de soulignement au format _function.

La convention d'appel __fastcall consiste à ajouter un signe "@" avant le nom de la fonction de sortie, suivi d'un signe "@" et du nombre d'octets de ses paramètres, au format @ fonction @ 8.

Ils ne modifient pas la casse des caractères dans le nom de la fonction de sortie, qui est différente de la convention d'appel PASCAL. Le nom de la fonction généré par la convention PASCAL n'est pas modifié et est entièrement en majuscules.

2. Règles de convention de modification de nom de fonction au moment de la compilation C ++:

Convention d'appel __stdcall:

(1) Utilisez "?" Pour identifier le début du nom de la fonction, suivi du nom de la fonction;

(2) Le nom de la fonction est suivi de "@@ YG" pour identifier le début de la table de paramètres, suivi de la table de paramètres;

(3) La table des paramètres est représentée par le code:

X - vide ,

D - caractère ,

E - caractère non signé ,

F - court ,

Allusion,

I - entier non signé ,

J - long ,

K - long non signé ,

M - flotteur ,

N - double ,

_N - booléen ,

....

PA-indique le pointeur, le code derrière indique le type de pointeur, si le pointeur du même type apparaît en continu, remplacez-le par "0", et un "0" représente une répétition;

(4) Le premier élément de la table des paramètres est le type de valeur de retour de la fonction, suivi du type de données du paramètre à son tour, et l'identificateur de pointeur est avant le type de données auquel il se réfère;

(5) Après la liste des paramètres, "@Z" est utilisé pour marquer la fin du nom entier. Si la fonction n'a pas de paramètres, elle se termine par "Z".

Le format est "? Functionname @@ YG ***** @ Z" ou "? Functionname @@ YG * XZ", par exemple:

int Test1 (char * var1, unsigned long) ----- "? Test1 @@ YGHPADK @ Z"

void Test2 () ----- "? Test2 @@ YGXXZ"

Convention d'appel __cdecl:

Les règles sont les mêmes que la convention d'appel _stdcall ci-dessus, sauf que l'identificateur de début de la liste de paramètres passe de "@@ YG" ci-dessus à "@@ YA".

Convention d'appel __fastcall:

Les règles sont les mêmes que la convention d'appel _stdcall ci-dessus, sauf que l'identificateur de début de la liste de paramètres passe de "@@ YG" ci-dessus à "@@ YI".

La déclaration par défaut de VC ++ pour les fonctions est "__cedcl", qui ne peut être appelée que par C / C ++.

 

C'est tout pour le partage d'aujourd'hui, et vous êtes invités à signaler tout problème.

 

Enfin, si vous souhaitez également devenir programmeur et maîtriser rapidement la programmation, rejoignez rapidement le cercle d'apprentissage des pingouins !

Il y a des ingénieurs de développement de logiciels professionnels qui peuvent répondre à tous vos doutes en ligne ~ Introduction au langage de programmation "si facile"

Programmation des livres d'apprentissage:

 

Programmation vidéo d'apprentissage:

 

Je suppose que tu aimes

Origine blog.csdn.net/Hsuesh/article/details/112544248
conseillé
Classement