Ce:
#define TEST(condn) if(...){...}else
est un non-sens; Qu'attendez-vous des ellipses (...) à faire!?
l'exemple d'utilisation que vous avez donné élargirait à
if(...){...} else if(...){...}else
{
//the code for the final else
}
qui est un non-sens manifestement; où est l'argument condn
utilisé?.De toute façon, quoi que vous vouliez vraiment l'ET n'a aucun effet autre que la lisibilité fictive. Si vous essayez d'inventer un nouveau langage, le préprocesseur C n'est pas le moyen de le faire. Je ne vois aucun avantage par rapport à ce que vous semblez vouloir accomplir par rapport à un code plus simple.
Si vous aviez l'intention:
#define TEST(condn) if(condn){/*some code*/}else
alors comment est la résultante:
if(a==b){/*some code*/} else if(b==c){/*some code*/}else
{
//the code for the final else
}
mieux que:
if(a==b || b==c)
{
/*some code*/
}
else
{
//the code for the final else
}
où /*some code*/
est inutilement dupliqués?
Notez que ici la seule condition enchaînée par ||
est équivalente à vos multiples conditions enchaînées par else if
, même si vous utilisez la TEST
macro, il n'y a pas besoin de l'utiliser de cette façon quand:
TEST(a==b || b==c)
{
//the code for the final else
}
suffira.
Les macros sont souvent mal avisées dans le meilleur des cas, mais vous avez choisi un exemple particulièrement frappant d'abus de macro! Considérons par exemple comment vous pourriez déboguer un tel code dans un débogueur au niveau source.
Votre usage prévu est illisible. Si quoi que ce soit, un lecteur s'attendrait à ce que le bloc '// le code du dernier else 'soit exécuté si' a == b && b == c', mais ceci est complètement différent de ce que ferait réellement votre code. Sauf si vous essayez de concevoir une entrée IOCCC, ne le faites pas. – jamesdlin
Il y a beaucoup mieux (comme dans des manières plus lisibles et moins sujette aux erreurs) de faire ce que vous essayez de faire. – bta