🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.lang.c
Article #15532

Re: macro "subtile"

#15532
From: Eric Levenez
Date: Sun, 18 Sep 2005 11:18
81 lines
3484 bytes
Le 18/09/05 12:56, dans <432d47bb$0$26362$626a14ce@news.free.fr>, ��Pierre
Habouzit�� <madcoder@debian.org> a �crit�:

> J'ai un tas de fonctions de parsing qui renvoient des ints.
> 
> les valeurs n�gatives de ces ints signifient `erreur' et les valeurs
> positives ont une s�mantique selon les fonctions.
> 
> j'ai donc souvent (� l'int�rieur de fonctions de parse) � �crire des trucs
> du genre :
> 
>     int parse_result;
> 
>     parse_result = ma_fonction_de_parse(ses_args);
>     if (parse_result < 0) {
>         return parse_result; /* faire remonter l'erreur */
>     }
>     /* ... utilise �ventuellement parse_result */
>     
> 
> ce qui � la longue rend les fonctions de parse un peu p�nibles � lire.

Avoir un code propre et lisible pas tous n'est pas forc�ment "p�nible".

> J'aurais donc aim� faire une macro (appelons la TRANSMIT_PARSE_ERROR) qui :
>  * soit fasse un return si le r�sultat est n�gatif
>  * soit prenne la valeur du r�sultat sinon
> pour pouvoir faire par exemple :
> 
>     int parse_result;
> 
>     switch (TRANSMIT_PARSE_ERROR(parse_result,
>             ma_fonction_de_parse(ses_args))
>     {
>     /* ... */
>     }

C'est g�n�ralement une tr�s mauvaise id�e de masquer par des macros le
v�ritable code. Ce n'est pas maintenable facilement et cela peut introduire
des effets de bord ind�sirables.

> j'ai essay� pas mal de trucs du genre :
> 
>     #define TRANSMIT_PARSE_ERROR(result, expr) \
>         if ( ((result) = (expr)) < 0 ) {       \
>             return result;                     \
>         } , result
> 
> ou encore :
> 
>     #define TRANSMIT_PARSE_ERROR(result, expr) \
>         ( ((result) = (expr)) < 0 ? return (result) : (result) )
> 
> et d'autres choses encore toutes plus moches les unes que les autres. Mais
> aucune ne cr�e du code syntaxiquement correct.

Tu peux toujours essayer un truc hideux du genre :

#define SWITCH_TRANSMIT_PARSE_ERROR(result, expr) \
    if ( ((result) = (expr)) < 0 ) {       \
        return result;                     \
    } \
    switch (result)


int parse_result;


    SWITCH_TRANSMIT_PARSE_ERROR(parse_result,
        ma_fonction_de_parse(ses_args))
    {
    /* ... */
    }

Ton code sera ainsi illisible et non maintenable, mais peut-�tre que tu le
trouveras pas "p�nible" � lire... :-)


-- 
�ric L�v�nez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Technical Details
Message-ID: <BF53199C.45780%new@levenez.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!newsfeed00.sul.t-online.de!t-online.de!grolier!usenet-fr.net!proxad.net!infeed-2.proxad.net!news18-e.free.fr!not-for-mail
References: <432d47bb$0$26362$626a14ce@news.free.fr>

Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,3560d64a4d94fc2b
X-Google-Attributes: gidf9822,public
X-Google-Language: FRENCH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!newsfeed00.sul.t-online.de!t-online.de!grolier!usenet-fr.net!proxad.net!infeed-2.proxad.net!news18-e.free.fr!not-for-mail
User-Agent: Microsoft-Entourage/11.1.0.040913
Date: Sun, 18 Sep 2005 13:18:20 +0200
Subject: Re: macro "subtile"
From: Eric Levenez <new@levenez.com>
Newsgroups: fr.comp.lang.c
Message-ID: <BF53199C.45780%new@levenez.com>
References: <432d47bb$0$26362$626a14ce@news.free.fr>
Mime-version: 1.0
Content-Type: text/plain;
 charset="ISO-8859-1"
Content-transfer-encoding: 8bit
Lines: 82
Organization: Guest of ProXad - France
NNTP-Posting-Date: 18 Sep 2005 13:18:23 MEST
NNTP-Posting-Host: 82.244.40.208
X-Trace: 1127042303 news18-e.free.fr 18072 82.244.40.208:54120
X-Complaints-To: abuse@proxad.net