Instructions précompilateur

11-12-2006 à 13:25:19
Bonjour,

Vous connaissez tous les instructions /COPY, /FREE et autres instructions servant au précompilateurs RPG.

Je suis tombé pas hasard sur des instructions que je ne connaissais pas: /DEFINE et /INCLUDE.

Quelqu'un pourrait-il me donner plus d'explications sur ces instructions (explications autres qu'un renvois vers le site d'IBM, j'ai déjà été voir, et je ne trouve pas cela très clair).

Merci d'avance à tous :)
  • Liens sponsorisés



11-12-2006 à 13:17:00
Pourtant, c'est simple. J'ai relu pour m'en assurer le redbook ILE RPG Reference où tout y est AMHA correctement expliqué en détail.

/COPY & /INCLUDE:
Les lignes générées par les directives /COPY et /INCLUDE sont insérées dans le source à l'endroit où ces directives se trouvent.
/INCLUDE et /COPY sont identiques, mais toutefois gérées différemment par le préprocesseur SQL.
La directive /COPY est développée par le préprocesseur. Les lignes copiées peuvent contenir du SQL intégré ou des définitions de variables hôte, contrairement à la directive /INCLUDE qui n'est pas développée par le préprocesseur et donc ne peut contenir ni du SQL intégré ni des définitions de variables hôte.

Les directives conditionnelles de compilation:

Ces directives permettent d'inclure ou d'exclure des sections de code source lors de la compilation.

Des noms-conditions peuvent être ajoutés ou enlevés d'une liste de conditions définies en utilisant les directives
/DEFINE et /UNDEFINE.

La directive /DEFINE ajoute un nom-condition à la liste des conditions déjà définies. Par conséquent, un /IF DEFINED(nom-condition) ultérieur sera vrai et un IF NOT DEFINED(nom-condition) ultérieur sera faux.
La condition /UNDEFINE fait l'inverse. Elle enlève un nom-condition de la liste des conditions déjà définies. Par conséquent, un /IF DEFINED(nom-condition) ultérieur sera faux et un IF NOT DEFINED(nom-condition) ultérieur sera vrai.

Ces conditions peuvent être testées par des directives
/IF nom-condition suivies des directives facultatives /ELSEIF ou /ELSE, suivies par une directive /ENDIF obligatoire.
Si l'expression-conditionnelle est vraie, les lignes source qui suivent la directive /IF sont sélectionnées par le compilateur, sinon les lignes sont ignorées jusqu'au /ELSEIF, /ELSE ou /ENDIF suivant.

En fait, c'est nous qui donnons un nom-condition aux directives /IF.

Exemple:

/if NOT defined(MesSpecifsD)
D ...
D ...
...
D/define MesSpecifsD
D/endif

Dans cet exemple, si le bloc "MesSpecifsD" n'est pas déjà défini, le compilateur lira les spécifications D qui existent entre les directives /if NOT defined(MesSpecifsD) et /endif.
Le bloc "MesSpecifsD" est défini par la directive /define MesSpecifsD.

La directive /EOF est également très importante.
Cette directive termine le /IF en cours de traitement. C'est à dire que le compilateur ne lira plus aucune directive et ira directement à la fin du membre ou du fichier qui contient cette directive.

Dans l'exemple qui suit, les définitions de mes prototypes sont dans un membre source que j'inclus dans mon programme par /COPY.
L'ensemble des ces définitions est conditionné par la directive générale if defined(SOCKET_PROTOTYPE). Par conséquent, si un /COPY de ce membre a déjà été fait quelque part dans mon programme, celui-ci ne sera pas de nouveau lu par le compilateur (ce qui générerait des erreurs de compilation) puisque j'ai indiqué /EOF dans la directive générale.

D/if defined(SOCKET_PROTOTYPE)
D/eof
D/endif
D/define SOCKET_PROTOTYPE
...
D/if not defined(CLOSE_PROTOTYPE)
D Close PR 10I 0 ExtProc('close')
D Sock_Desc 10I 0 Value
D/define CLOSE_PROTOTYPE
D/endif
...
D/if not defined(FCNTL_PROTOTYPE)
D fcntl PR 10I 0 ExtProc('fcntl')
D SocketDesc 10I 0 Value
D Command 10I 0 Value
D Arg 10I 0 Value Options(*NOPASS)
D/define FCNTL_PROTOTYPE
D/endif


Ai-je été clair dans mes explications ?
11-12-2006 à 13:24:44
Tu as été super clair Philippe...comme dh'abitude ;)
11-12-2006 à 13:25:19
Merci beaucoup
  • Liens sponsorisés