Обратите внимание, что у некоторых из ответов здесь есть проблема.
Например, для нормального утверждения вы можете сделать это:
if (foo)
function();
else
otherstuff();
Если вы следовали здесь некоторым советам, но если заменить function
макросом, он может расшириться до:
if (foo)
if (something) { /* ... */ }
else { /* ... */ }; // <-- note evil semicolon!
else
otherstuff();
Итак, обычный (безобразный) взлом, который люди делают, чтобы избежать этого:
#define MATCH_SYMBOL(symbol, token) \
do \
{ \
if(something == symbol) \
{ \
if( symbol == '-') \
{ \
} \
else if (symbol != '-') \
{ \
} \
other steps; \
} \
} \
while (0) // no semicolon here
Это так, что «оператор» MATCH_SYMBOL(a, b)
может заканчиваться точкой с запятой, как обычный оператор. У вас также есть скобки вокруг нескольких операторов.
Если вы думаете, что никто не сошел с ума, чтобы использовать эту технику, подумайте еще раз. Например, это очень распространено в ядре Linux.