38 votes

Que signifie "cdecl" ?

Oui, je sais que "cdecl" est le nom d'une convention d'appel importante, alors ne m'expliquez pas les conventions d'appel. Ce que je demande, c'est ce que l'abréviation ( ?) "cdecl" signifie réellement. Je pense que c'est un mauvais choix de nom, parce qu'à première vue, il rappelle le "déclarateur C" (un aspect syntaxique plutôt unique du C). En fait, il existe un programme appelé cdecl dont le seul but est de déchiffrer les déclarateurs C. Mais la syntaxe des déclarateurs C n'a absolument rien à voir avec les conventions d'appel, pour autant que je sache.

Version simplifiée : "stdcall" signifie "convention d'appel standard". Que signifie "cdecl" ?

1voto

doron Points 10296

Le C a le concept de fonctions et de variables, l'assembleur / le code machine ne l'ont pas. Lorsque l'on veut passer des valeurs aux fonctions, cela doit être fait soit en utilisant les registres du processeur, soit une valeur en mémoire à un décalage fixe d'un registre (normalement le pointeur de pile désigné). Ainsi, lorsque nous sautons à une nouvelle adresse au début de notre fonction, les bonnes valeurs se trouvent aux bons endroits pour que la fonction fonctionne correctement. Il en va de même pour les valeurs de retour.

La manière dont cela fonctionne en pratique est définie dans un document qui décrit les conventions d'appel du système. La convention d'appel est unique à l'architecture du processeur et au système d'exploitation.

Sous Windows x86, un certain nombre de conventions d'appel sont utilisées. Dans la convention d'appel "cdecl", l'appelant place les fonctions sur la pile pour que le destinataire les utilise. Une fois la fonction terminée, l'appelant nettoie sa propre pile.

Les API Windows utilisent la convention d'appel "stdcall", qui est similaire au cdelc, sauf que le destinataire de l'appel nettoie la pile. (Cela signifie que les appels de fonction vararg ne peuvent pas être utilisés). Cette convention a l'avantage d'économiser de l'espace dans le code.

Windows dispose également d'une convention d'appel "fastcall" qui utilise des registres pour le passage des paramètres.

Puisque Windows permet de multiples conventions d'appel, le compilateur C (cl) étend le langage C avec __cdecl , __stdcall y __fastcall . Ceci décore la déclaration de la fonction et permet au programmeur de spécifier la convention d'appel utilisée.

D'autres plateformes comme ARM, Itanium et autres ont leurs propres conventions d'appel.

0voto

TonyK Points 8604

Mise à jour de J'ai totalement révisé ceci, après que les commentaires aient montré à quel point j'avais tort. cdecl signifie que cette fonction utilise la même convention d'appel que la fonction C utilisation des fonctions. extern "C" signifie, en outre, que le nom de la fonction ne doit pas être soumis à l'épreuve de l'usure. C++ le mélange de noms.

Quant à la raison pour laquelle il s'appelle cdecl Je ne sais plus.

0voto

SoLaR Points 18

La CDECL n'a pas d'abréviation, c'est juste le nom de la convention d'appel.

Si ce n'est pas ce que vous recherchiez, mais en fait l'histoire du CDECL alors :

Il s'agit d'un attribut de convention d'appel spécifique à Microsoft (au moment de son introduction, quelque part entre 1985 et 1995), qui est ensuite devenu la norme.

Dommage que la page soit perdue sur Internet (wayback n'a rien non plus), mais ceux qui ont des vieux CD MSDN peuvent trouver le sujet "Summary of Declaration" dans "C Language Reference" qui indique clairement ce qui suit :

attribute-seq : /* attribute-seq est spécifique à Microsoft */

attribut attribut-seq opt attribut : un des éléments suivants /* Spécifique à Microsoft */

__asm __fastcall __based __inline __cdecl __stdcall

également dans la même vieille documenttion MSDN __cdecl

__cdecl Home | Overview | How Do I

Spécifique à Microsoft ->

Il s'agit de la convention d'appel par défaut pour les programmes C et C++. Parce que la pile est nettoyée par l'appelant, il peut faire des fonctions vararg. La convention d'appel __cdecl crée des exécutables plus volumineux que __stdcall, car elle exige que chaque appel de fonction comprenne un code de nettoyage de la pile. La liste suivante montre l'implémentation de cette convention d'appel d'appel.

sinon, nous sommes tous perdus dans votre question (veuillez la réviser) ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X