Я пишу оболочку для realloc
.Для возвращаемых значений я использую это:
typedef enum { SALLOC_OK, SALLOC_OVERFLOW, SALLOC_ALLOCFAIL, ... } salloc_rc;
Это используется в такой функции:
salloc_rc salloc(<args>) {
if(blabla) return SALLOC_OVERFLOW;
if(blabla) return SALLOC_ALLOCFAIL;
/* More error codes */
return SALLOC_OK;
}
Это, конечно, не полный код, но этого достаточно, чтобы продемонстрироватьчто я хочу.Все идет нормально.Я могу проверить возвращаемое значение следующим образом:
if(salloc(a,b) != SALLOC_OK) // Handle error
или, если я хочу быть более точным:
if(salloc(a,b) == SALLOC_OVERFLOW) // Handle overflow
Однако я хочу, чтобы это было совместимо с обычным способом проверкиза ошибку.Я хочу иметь возможность использовать:
if(!salloc(a,b)) // Handle error
и
if(salloc(a,b) { /* Do stuff */ }
else { /* Handle error */ }
Проблема здесь в том, что 0 ложно, а ВСЕ остальное верно.То, что я хочу сделать, кажется невозможным, но мог бы быть какой-то путь, который я пропустил.Единственное решение, которое я нашел до сих пор, это дать функции дополнительный аргумент с указателем на место, где я могу сохранить код ошибки, но я хочу избежать этого, если это возможно.
TL; DR
Как сделать функцию <type> foo()
способной возвращать различные сообщения об ошибках в зависимости от того, что пошло не так, при этом сохраняя возможность проверять наличие ошибок «традиционным» способом, таким как
if (!foo()) exit(EXIT_FAILURE);