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" ?

32voto

Peer Stritzinger Points 4996

Il provient d'une fonction C qui a été déclarée (par opposition à une fonction C qui n'a pas été déclarée, ce qui était courant dans le K&R C).

À l'époque, elle coexistait avec la convention d'appel pascal (où le destinataire de l'appel effaçait la pile), il était donc logique de l'appeler d'après le langage de programmation.

Tout ce que vous avez toujours voulu savoir sur les conventions d'appel.

17voto

Fred Nurk Points 8927

Tu lis trop dans tout ça. Il s'agit de la convention d'appel de l'implémentation pour appeler les fonctions C en général (mais particulièrement importante avec les varargs).

Il ne doit pas nécessairement s'agir d'une abréviation combinant "C" et "déclaration" ; les noms ne sont que des noms, surtout en programmation. Les mnémoniques sont utiles, mais même si "malloc" signifie "allouer de la mémoire", il a une signification supplémentaire que nous lui connaissons et à laquelle nous l'attachons ; "alloca" signifie également "allouer de la mémoire", par exemple.

Ou prenez "struct" qui "signifie" une "structure", mais "structure" est si générique en soi que sans la signification que nous attachons inconsciemment à "struct", nous serions désespérément perdus - comme le sont souvent les nouveaux programmeurs qui apprennent encore la terminologie.

14voto

GolezTrol Points 54531

Déclaration C. Une déclaration introduite par/pour C.

[modifier]

Je dois honnêtement admettre que je ne sais pas vraiment si c'est la signification de ce terme, bien qu'il ait été introduit par/pour C. Mais depuis que l caller doit nettoyer la mémoire allouée (contrairement à la plupart des autres conventions d'appel). Cela pourrait aussi être un moyen mnémotechnique pour "Caller Does End CLeaning" (l'appelant termine le nettoyage) qui, je pense, est un bon aide-mémoire :D

4voto

Felix Quehl Points 416

El cdecl (déclaration C) est généralement la convention d'appel par défaut des compilateurs C x86.

En informatique, une convention d'appel est un schéma d'implémentation (de bas niveau) pour la façon dont les sous-routines reçoivent des paramètres de leur appelant et comment elles retournent un résultat. Les différences entre les diverses implémentations incluent l'emplacement des paramètres, des valeurs de retour, des adresses de retour et des liens de portée (registres, pile ou mémoire, etc.), ainsi que la répartition des tâches de préparation d'un appel de fonction et de restauration de l'environnement entre l'appelant et l'appelé.

_(Source)_

Les conventions d'appel peuvent être liées à la stratégie d'évaluation d'un langage de programmation particulier, mais le plus souvent elles ne sont pas considérées comme en faisant partie (ou vice versa), car la stratégie d'évaluation est généralement définie à un niveau d'abstraction plus élevé et considérée comme faisant partie du langage plutôt que comme un détail d'implémentation de bas niveau du compilateur d'un langage particulier.

_(Source)_

El cdecl (qui signifie "déclaration C") est une convention d'appel qui provient du compilateur de Microsoft pour le langage de programmation C et qui est utilisée par de nombreux compilateurs C pour l'architecture x86. Dans cdecl les arguments des sous-programmes sont passés sur la pile. Les valeurs entières et les adresses de mémoire sont renvoyées dans la section EAX les valeurs à virgule flottante dans le registre ST0 Registre x87. Registres EAX , ECX et EDX sont sauvegardés par l'appelant, et les autres sont sauvegardés par l'appelant. Les registres à virgule flottante de x87 ST0 à ST7 doit être vide (vidée ou libérée) lors de l'appel d'une nouvelle fonction, et ST1 à ST7 doit être vide à la sortie d'une fonction. ST0 doit également être vide lorsqu'elle n'est pas utilisée pour renvoyer une valeur.

Dans le contexte du langage de programmation C, les arguments des fonctions sont poussés sur la pile dans l'ordre de droite à gauche, c'est-à-dire que le dernier argument est poussé en premier.

Considérons l'extrait de code source C suivant :

int callee(int, int, int);

int caller(void)
{
    return callee(1, 2, 3) + 5;
}

Sur x86, il pourrait produire le code assembleur suivant (syntaxe Intel) :

caller:
    ; make new call frame
    ; (some compilers may produce an 'enter' instruction instead)
    push    ebp       ; save old call frame
    mov     ebp, esp  ; initialize new call frame
    ; push call arguments, in reverse
    ; (some compilers may subtract the required space from the stack pointer,
    ; then write each argument directly, see below.
    ; The 'enter' instruction can also do something similar)
    ; sub esp, 12      : 'enter' instruction could do this for us
    ; mov [ebp-4], 3   : or mov [esp+8], 3
    ; mov [ebp-8], 2   : or mov [esp+4], 2
    ; mov [ebp-12], 1  : or mov [esp], 1
    push    3
    push    2
    push    1
    call    callee    ; call subroutine 'callee'
    add     esp, 12   ; remove call arguments from frame
    add     eax, 5    ; modify subroutine result
                      ; (eax is the return value of our callee,
                      ; so we don't have to move it into a local variable)
    ; restore old call frame
    ; (some compilers may produce a 'leave' instruction instead)
    mov     esp, ebp  ; most calling conventions dictate ebp be callee-saved,
                      ; i.e. it's preserved after calling the callee.
                      ; it therefore still points to the start of our stack frame.
                      ; we do need to make sure
                      ; callee doesn't modify (or restores) ebp, though,
                      ; so we need to make sure
                      ; it uses a calling convention which does this
    pop     ebp       ; restore old call frame
    ret               ; return

L'appelant nettoie la pile après le retour de l'appel de fonction.

El cdecl est généralement la convention d'appel par défaut des compilateurs C x86, bien que de nombreux compilateurs fournissent des options permettant de modifier automatiquement les conventions d'appel utilisées. Pour définir manuellement une fonction qui sera cdecl certains supportent la syntaxe suivante :

return_type __cdecl func_name();

Calling convention est le nom de la convention d'appel. __cdecl , __stdcall , __pascal y __fastcall peuvent être spécifiées explicitement dans les déclarations de fonctions C++ pour les compilateurs qui supportent ces conventions. __cdecl est la valeur par défaut pour les applications et les bibliothèques statiques. __stdcall est par défaut pour les appels système (y compris les appels de l'API Windows) et recommandé pour les bibliothèques DLL sous Windows 32 bits. __thiscall est utilisé par défaut dans les compilateurs Microsoft pour les membres en mode 16 et 32 bits. Microsoft, Borland, Watcom et Gnu sont des marques de compilateurs. Les compilateurs Intel pour Windows sont compatibles avec Microsoft. Les compilateurs Intel pour Linux sont compatibles avec Gnu. Les compilateurs Symantec, Digital Mars et Codeplay sont compatibles avec compatibles avec Microsoft. En mode 64 bits, il existe une convention d'appel par défaut pour chaque système d'exploitation. système d'exploitation, tandis que les autres conventions d'appel sont rares en mode 64 bits.

Autres conventions :

  • __pascal
  • __fortran
  • __thiscall
  • __stdcall
  • __fastcall
  • __msfastcall
  • __regcall
  • __vectorcall

_(Source)_

2voto

Curt Points 161

Le terme CDECL trouve son origine dans le BASIC de Microsoft et son écosystème de programmation en langage mixte. Cet écosystème permettait à chacun des quatre principaux langages de Microsoft (BASIC, FORTRAN, Pascal et C) de faire des appels à n'importe quel autre. Chaque langage avait une convention d'appel légèrement différente, et chacun avait un moyen de déclarer qu'une fonction ou procédure externe utilisait une convention spécifique.

En BASIC, le DECLARE doit être utilisée avant que vous puissiez appeler une fonction externe avec l'instruction CALL déclaration. Pour désigner une procédure ou une fonction externe en FORTRAN ou en Pascal, vous écrirez l'une des instructions suivantes

DECLARE SUB Foo ()
DECLARE FUNCTION Foo ()

Les conventions d'appel du C diffèrent des autres langages en partie parce que les arguments sont poussés sur la pile dans l'ordre inverse. Vous en informiez BASIC en ajoutant le modificateur CDECL :

DECLARE SUB Foo CDECL ()
DECLARE FUNCTION Foo CDECL ()

En revanche, lorsqu'on écrit en FORTRAN ou en Pascal, le modificateur est [C]. Cela indique que CDECL était spécifique à l'instruction DECLARE de BASIC et n'était pas et non un terme déjà établi. À l'époque, il n'existait pas de terme spécifique pour les "conventions d'appel C". Ce n'est qu'avec l'avènement de nouvelles conventions d'appel dans WIN32 (stdcall, fastcall, etc.) que "cdecl" a été coopté et est devenu le nom de facto pour désigner les conventions héritées en l'absence d'un autre terme.

En résumé, CDECL signifie "déclaration C". Il trouve son origine dans les compilateurs BASIC, et non dans les compilateurs C. Il s'agissait d'un mot-clé BASIC choisi arbitrairement, et quelque peu redondant car le simple "C" ne pouvait pas être un mot-clé.

Vous trouverez des détails sur la CDECL dans ce document de 1987 :

https://archive.org/details/Microsoft_Macro_Assembler_5.1_Mixed_Language_Programming_Guide/page/n1/mode/2up?q=cdecl

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