вы не можете return
из макроса и ожидать, что он ведет себя как функция. Код макроса раскрывается буквально в вашем коде, так что теперь у вас есть переключатель / регистр и набор return
операторов в последнем параметре printf
!
Кроме того, здесь нет смысла использовать макрос, так как вы не используете в нем вставку токенов, нанизывание или другие макросы, такие как __FILE__
или __LINE__
(в отличие от вашего макроса THROW_ERROR
, который их использует).
Вместо этого определите функцию MESSAGE
(или лучше: message
):
const char *message(int code)
{
switch (err) {
case ERROR_NO_MEMORY:
return MSG_NO_MEMORY;
case ERROR_INVALID_INDEX:
return MSG_INVALID_INDEX;
case ERROR_INVALID_VALUE:
return MSG_INVALID_VALUE;
}
return "unknown error"; // just in case no code matches
}
и передайте это printf
Кроме того, оберните ваш макрос THROW_ERROR
в фигурные скобки, так как есть 2 утверждения:
#define THROW_ERROR(err) do { \
fprintf(stderr, "Error in %s:%d: %s.\n", __FILE__, __LINE__, message(err)); \
exit(EXIT_FAILURE); } while(0)
иначе, если вы сделаете:
if (fail_code) THROW_ERROR(12);
тогда только ошибка fprintf
выполняется при возникновении ошибки, и exit
происходит независимо от того, что!