Вам нужно сделать так, чтобы он работал как вызов функции, поэтому его можно использовать везде, где возможен вызов функции, за исключением случаев, когда значение не возвращается. Вам также нужно пометить концы промежуточных строк обратной косой чертой. И идиома 'do { ... } while (0)
полезна в этом контексте:
#define DISPLAY_ERR() do { ERR_INFO error_info; ErrorInfo(&error_info); \
fprintf(stderr, "And the error is? [ %s ]\n", error_info.msg); } while (0)
Переменная error_info
является локальной для блока, поэтому вам не нужно забывать объявлять ее в функциях, где вы используете макрос (или иметь его как статический файл или, как вы думаете, глобальную переменную) .
Обратите внимание, что этот код не возвращает значение, но его можно использовать в любом месте функции, где можно использовать выражение void
:
if (somefunc() != 0)
DISPLAY_ERR();
else if (anotherfunc() != 0)
DISPLAY_ERR();
else
do_something_useful_after_all();
1012 * Etc. *
Я все еще хотел бы убедиться, что я измерил издержки использования обычной функции по сравнению с наличием подобного функции макроса. При достаточно частом использовании вам, возможно, все-таки будет лучше с реальной функцией.