[gull] cours C++

Leopoldo Ghielmetti leopoldo.ghielmetti at a3.epfl.ch
Thu Mar 2 10:58:54 CET 2006


Une macro mal définie ne veut pas dire que le langage est pourri,
simplement que le programmeur ne sait pas programmer.

Dans le cas de la macro de debug MA_MACRO il faut la définir comme ça:
#ifdef DEBUG
#  define MA_MACRO(x) do{function(x); debug(x);}while(0)
#else /* !DEBUG */
#  define MA_MACRO(x) function(x)
#endif /* DEBUG */

Et la tu n'a plus de problèmes à l'utiliser comme tu le dit.

Et si on sait p.e. que la variable x est un entier (chose qui est
définie par le type des fonctions) il pourra aussi protéger x d'une
mauvaise utilisation de la façon suivante:
#  define MA_MACRO(x) do{int xx=(x); function(xx); debug(xx);}while(0)

de cette façon même l'appel:
if (arg)
  MA_MACRO(arg++);

se passera bien dans les deux cas. Clairement on va être limités dans la
surcharge des fonctions fonction et debug. Ma solution normalement
consiste à appeler dans la macro deux fonctions différentes:
#ifdef DEBUG
#  define MA_MACRO(x) functionD(x)
#else /* !DEBUG */
#  define MA_MACRO(x) function(x)
#endif /* DEBUG */

inline void functionD(int x) {function(x); debug(x);}

Et la plus de problèmes du tout, même en cas de surcharge, il suffit de
définir autant de fonctions D que de cas possibles pour function et
debug (ou utiliser un template).

Clairement ce genre de macro ont tout leur sens dans la programmation C.
En C++ il y a des solutions plus élégantes mais savoir écrire une bonne
macro est fondamental pour la programmation en C et dérivés.

ciao, Leo

On Fri, 2006-02-24 at 19:26 +0100, Marc SCHAEFER wrote:
> On Fri, Feb 24, 2006 at 11:47:52AM +0100, Marc Mongenet wrote:
> > C++ les rejettent avec force. Franchement, les macros méritent la
> > plus grande méfiance, non ?
> 
> J'adore notamment ce cas-là:
> 
> #ifdef DEBUG
> #define MA_MACRO(x) function(x); debug(x)
> #else /* !DEBUG */
> #define MA_MACRO(x) function(x)
> #endif /* DEBUG */
> 
> utilisé avec:
> 
>    if (arg)
>       MA_MACRO(arg);
> 
> 
> PS: personnellement je suis un adepte des parenthèses et des accolades
>     partout, ainsi que des espaces pour bien voir ce qui se passe. Et
> je
>     fais plutôt du C que du C++
> 
> 
> _______________________________________________
> gull mailing list
> gull at lists.alphanet.ch
> http://lists.alphanet.ch/mailman/listinfo/gull




More information about the gull mailing list