Article View: fr.comp.lang.c
Article #15533Re: macro "subtile"
From: Pierre Habouzit
Date: Sun, 18 Sep 2005 11:38
Date: Sun, 18 Sep 2005 11:38
89 lines
3879 bytes
3879 bytes
Eric Levenez wrote:
> 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".
justement, lorsque ta fonction de parse en utilise beaucou d'autres, le code
de la dite fonction n'arrete pas de tester les retours, ce qui est
largement d�sagr�able, parce que � cause de ca, le code de la fonction
d�passe all�grement les 30 lignes, et tu ne peux pas voir d'un seul coup
d'oueil ce qu'elle fait.
la concision est *aussi* une forme de lisibilit�.
maintenant, je crois que demander � ma macro de retourner le resultat est
trop demander d'expressivit�, donc je vais me contenter de lui faire faire
#define TRANSMIT_PARSE_ERROR(result, expr) \
do { \
if ( ((result) = (expr)) < 0 ) { \
return result; \
} \
} while(0)
qui permet au moins de "cacher" le test.
> Tu peux toujours essayer un truc hideux du genre :
>
> #define SWITCH_TRANSMIT_PARSE_ERROR(result, expr) \
> if ( ((result) = (expr)) < 0 ) { \
> return result; \
> } \
> switch (result)
non, ca c'est pas hideux, c'est atroce ;p
> 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... :-)
ca oui c'est inmaintenable, je suis tout � fait d'accord avec toi.
je voulais en effet sans doute faire "trop" concis.
un :
int parse_result;
TRANSMIT_PARSE_ERROR(parse_result, ma_fonction_de_parse(ses_args));
switch(parse_result) {
/* ... */
}
est apr�s tout un bon compromis.
merci !
--
�O� Pierre Habouzit
��O madcoder@debian.org
OOO http://www.madism.org
Technical Details
Message-ID:
<432d517a$0$29495$626a14ce@news.free.fr>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!proxad.net!infeed-1.proxad.net!news18-e.free.fr!not-for-mailReferences:
<432d47bb$0$26362$626a14ce@news.free.fr> <BF53199C.45780%new@levenez.com>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!news2.google.com!proxad.net!infeed-1.proxad.net!news18-e.free.fr!not-for-mail
Message-ID: <432d517a$0$29495$626a14ce@news.free.fr>
From: Pierre Habouzit <madcoder@debian.org>
Subject: Re: macro "subtile"
Newsgroups: fr.comp.lang.c
Date: Sun, 18 Sep 2005 13:38:26 +0200
References: <432d47bb$0$26362$626a14ce@news.free.fr> <BF53199C.45780%new@levenez.com>
User-Agent: KNode/0.9.2
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8Bit
X-Face: $(^e[V4D-[`f2EmMGz@fgWK!e.B~2g.{08lKPU(nc1J~z\4B>*JEVq:E]7G-\6$Ycr4<;Z!|VY6Grt]+RsS$IMV)f>2)M="tY:ZPcU;&%it2D81X^kNya0=L]"vZmLP+UmKhgq+u*\.dJ8G!N&=EvlD
Lines: 89
Organization: Guest of ProXad - France
NNTP-Posting-Date: 18 Sep 2005 13:37:30 MEST
NNTP-Posting-Host: 82.225.205.10
X-Trace: 1127043450 news18-e.free.fr 29495 82.225.205.10:36729
X-Complaints-To: abuse@proxad.net