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
> [email protected]
> http://lists.alphanet.ch/mailman/listinfo/gull
_______________________________________________
gull mailing list
[email protected]
http://lists.alphanet.ch/mailman/listinfo/gull