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 ?