Оператор возврата в макросе вернется из функции, которая «вызывает» макрос. Функциональные макросы являются сокращением для генерации одного и того же кода несколько раз. Они не являются фактическими вызовами функций.
Вот пример того, почему вы можете поместить возврат в макрос:
/* do-while() loop is a trick to let you define multi-statement macros and */
/* call them like functions. Note the lack of trailing ';' */
#define ERROR(msg) do{ fprintf(stderr, (msg)); errorCount++; return -1; }while(0)
/* foo() returns 0 or success or -1 on failure */
int foo(int x, int y){
if ( x < 10 )
{
ERROR("x is out of range\n");
}
if ( y < 20 )
{
ERROR("y is out of range\n");
}
doSomething(x,y);
return 0;
}
Вызов foo с x = 25 приведет к возврату -1, и будет напечатано сообщение «x вне диапазона».
Не говорю, что это хороший стиль, но, надеюсь, иллюстрирует, как возврат в макросе отличается от возврата в функции.