Это:
#define TEST(condn) if(...){...}else
ерунда; что вы ожидаете от эллипсов (...)!?
пример использования, который вы дали, расширится до
if(...){...} else if(...){...}else
{
//the code for the final else
}
что явная ерунда; где используется аргумент condn
? В любом случае, независимо от того, что вы на самом деле предполагали, AND не оказывает никакого влияния, кроме фиктивной читабельности. Если вы пытаетесь изобрести новый язык, препроцессор C не способ сделать это. Я не вижу преимущества в том, чего вы пытаетесь достичь по сравнению с более простым кодом.
Если вы намеревались:
#define TEST(condn) if(condn){/*some code*/}else
тогда как получается:
if(a==b){/*some code*/} else if(b==c){/*some code*/}else
{
//the code for the final else
}
лучше чем:
if(a==b || b==c)
{
/*some code*/
}
else
{
//the code for the final else
}
, где /*some code*/
не дублируется без необходимости?
Обратите внимание, что здесь единственное условие, объединенное в цепочку ||
, эквивалентно вашим множественным условиям, объединенным в цепочку else if
, поэтому даже если вы используете макрос TEST
, нет необходимости использовать его таким образом, когда:
TEST( a==b || b==c)
{
//the code for the final else
}
будет достаточно.
В лучшие времена макросы часто бывают необоснованными, но вы выбрали особенно яркий пример злоупотребления макросами! Рассмотрим, например, как вы можете отлаживать такой код в отладчике исходного уровня.