2010-05-05 5 views
20

Je me demandais pourquoi dans certains codes source il y a ces macros comme FAR et PASCAL. Que veulent-ils dire et faire? Merciqu'est-ce que FAR PASCAL?

+10

Ils invoquez une machine à temps, puis une Gates de 30 ans Bill ressorte et exige son retour 640k. –

Répondre

19
  • PASCAL: Il est associé à un calling convention. Les paramètres sont poussés sur la pile dans l'ordre de gauche à droite (opposé de cdecl), et l'appelé est responsable de l'équilibrage de la pile avant le retour.

    Cette convention d'appel était courante dans les API 16 bits suivantes: OS/2 1.x et Microsoft Windows 3.x. FAR: Dans un ordinateur à architecture segmentée, un far pointer est un pointeur qui inclut un sélecteur de segment, permettant de pointer vers des adresses en dehors du segment courant. .

Pour être complet, FAR et macros sont PASCAL prepreocessor que, lors de la compilation pour les systèmes 16 bits, dilatent les mots-clés qui ont été nécessaires pour déclarer la convention d'appel et la taille du pointeur. Sur les systèmes 32 bits, ils s'étendent généralement à rien (sauf si vous avez une convention d'appel par défaut bizarre). Les macros sont conservés pour la rétrocompatibilité {hat/tip: commentaire de Adrian McCarthy}

+0

Je suis à peu près sûr que la convention d'appel Delphi par défaut a toujours été * register *. Il utilisait uniquement * pascal * pour les fonctions de l'API Windows et d'autres DLL. –

+3

Pour être complet, '' FAR' et PASCAL' sont des macros prepreocessor que, lors de la compilation pour les systèmes 16 bits, dilatent les mots-clés qui ont été nécessaires pour déclarer la taille et pointeur convention d'appel. Sur les systèmes 32 bits, ils s'étendent généralement à rien (sauf si vous avez une convention d'appel par défaut bizarre). Les macros sont conservées pour une compatibilité descendante. –

3

FAR est une survivance de l'ère 16 bits, lorsque nous avions près (16 bits) et loin (32 bits) des pointeurs.

PASCAL est une convention d'appel. Je crois que c'est équivalent à stdcall de nos jours.

9

Allant par la mémoire ici,

est loin qu'une alternative aux jours 16 bits lorsque la mémoire du tas a été segmenté. Les données de NEAR étaient limitées en taille et plus rapidement, FAR était autorisé à être plus grand mais plus cher. Pour autant que je sache, en 32 bits, c'est une macro qui s'effondre à néant.

PASCAL est une convention d'appel utilisée aussi fortement en jours de 16 bits. Il a depuis été remplacé par stdcall.

Les deux sont laissés pour la rétrocompatibilité.

1

Il est probablement un peu redondant/obsolète codage à gauche de l'ère 16bits. FAR a été utilisé dans les applications 16 bits pour indiquer que l'adresse nécessitait plus de 16 bits. PASCAL (altion) est un type de conversion, il indique au compilateur comment la pile est organisée (en utilisant les conventions d'appel PASCAL) afin que le compilateur puisse passer les paramètres appropriés vers et depuis la fonction.

HTH

2

c'est une ancienne convention d'appel ...

FAR est héritée d'une époque où les registres du processeur où trop petit pour contenir l'adresse complète d'une destination de saut. Ainsi, les processeurs avaient 2 types de sauts en fonction de la "distance" de la destination par rapport au compteur du programme en cours.PASCAL décrit l'ordre des arguments sur la pile, il indique que la fonction utilise l'ordre décrit par le langage de programmation Pascal, différent de C. (version très ancienne des systèmes d'exploitation comme MacOS et Windows où développé en Pascal) .

6

FAR est obsolète; il était utilisé dans le code 16 bits pour indiquer les pointeurs qui pouvaient traiter l'intégralité de l'espace d'adressage, plutôt que juste un décalage de 16 bits par rapport au segment en cours.

PASCAL est une convention d'appel. Comme Wikipedia décrit:

Les paramètres sont poussés sur la pile dans l'ordre de gauche à droite (en face de cdecl), et l'appelé est responsable de l'équilibrage de la pile avant le retour.

Cette convention d'appel était commun dans les 16 API de bits suivants: OS/2 1.x, Microsoft Windows 3.x et Borland Delphi version 1.x.

+0

Mark, je suis nouveau en C++ et on m'a demandé de convertir un ancien code C/C++ en C++ 11. Le type de données «short FAR *» est adopté de manière intensive et ne sera pas résolu dans VS2013 - devrais-je les remplacer, si oui avec quoi? – MoonKnight

+0

@Killercam vous devriez être en mesure de laisser tomber «FAR» et «NEAR» partout où vous les trouvez. Bien que je sois surpris qu'ils ne soient pas déjà '# define'd comme des macros vides par les en-têtes de Microsoft, ils sont les rois de la compatibilité descendante. –

1

Plus précisément PASCAL dit les arguments de la fonction sont passés, de gauche à droite, ce qui réduit la taille du code (parce que l'appelant sait la taille de la pile est et ne peut donc nettoyer)

Le C stdcall passe les arguments de droite à gauche, cela signifie que vous pouvez avoir un nombre variable d'arguments, mais plus de code est nécessaire pour effacer.