Поскольку вы используете info->error
, чтобы сказать, если функция не выполнена или нет, вы можете вернуть все, что захотите, так как вызывающая сторона должна игнорировать возвращаемое значение. Таким образом, вы можете отключить предупреждение с помощью return -1
, return 0
, return MAGIC_NUMBER
... ...
В целом, однако, функции закодированы «противоположным образом»: возвращаемое значение говорит, была ли функция выполнена успешно или нет. Если все возвращаемые значения int являются хорошими, вы можете написать функцию так, чтобы она возвращала сбой или успех, и при успешном завершении вы заполняете данные. В вашем случае ваша информационная структура может содержать int data
, или вы можете добавить еще один аргумент в функцию.
Таким образом, вызывающая сторона может сделать что-то вроде
if ( pop(stack, info) == SUCCESS ) {
// ...
printf("%d\n", info->data);
} else { /* failure */
// info->data holds no data, but info->error could be an error code, e.g.
fprintf(stderr, "can't pop: %s\n", error_msg[info->error]);
}
Использование в вашем случае менее интуитивно понятно:
data = pop(stack, info);
if (info->error != ERROR) {
// data is valid
} else {
// data is garbage and we have to say an error occurred.
}
Кстати, вы не устанавливаете info->error
на что-то другое, равное 0, поэтому ваш код потенциально содержит ошибки; например,
info->error = 0;
data = pop(stack, info);
всегда будет вызывать ошибку, даже если на самом деле стек в порядке и данные верны.