Exemple de mauvaise utilisation

Du fait de l'absence de contrainte sur reste-de-la-ligne, on peut faire des choses très déraisonnables avec les macros. Un exemple célèbre est le source du shell écrit par Steve Bourne pour le système UNIX. Bourne avait utilisé les facilités de macros pour programmer dans un dialecte de Algol 68. Voici un extrait de ses définitions :
#define IF      if(
#define THEN    ){
#define ELSE    } else {
#define ELIF    } else if (
#define FI      ;}

#define BEGIN   {
#define END     }
#define SWITCH  switch(
#define IN      ){
#define ENDSW   }
#define FOR     for(
#define WHILE   while(
#define DO      ){
#define OD      ;}
#define REP     do{
#define PER     }while(
#undef DONE
#define DONE    );
#define LOOP    for(;;){
#define POOL    }
Et voici un exemple de code :
assign(n,v)
        NAMPTR          n;
        STRING          v;
{
        IF n->namflg&N_RDONLY
        THEN    failed(n->namid,wtfailed);
        ELSE    replace(&n->namval,v);
        FI
}
Ce n'est ni du C ni de l'Algol, il y a un consensus dans la communauté C pour estimer que ce genre de choses est à proscrire.



Matthieu Moy 2017-02-08