Сообщение об ошибках в библиотеке C

Я ищу надежный способ сообщения об ошибках в библиотеке C. Рассмотрим простой пример очереди:

struct queue *q = malloc(sizeof(*q));
if (NULL == q) {
    /* malloc failed. now what ? */
    return NULL; /* maybe ? */
}

Хорошо, поэтому для этого примера возврат NULL в противном случае недопустим, поэтому имеет смысл вернуть его, чтобы сигнализировать об ошибке. Но

void *get_data()
{
    /* stuff */

    /* Error detected. NULL is a valid return, now what ? */

    /* stuff */
}

Более того, как только мы сообщаем об ошибке, как сообщить , что такое ошибка? Я думал об этом, и у меня нет удовлетворительного решения.

  • Использование errno или какого-либо другого глобального объекта не то, что я хотел бы сделать (возможно функции могут быть вызваны из несколько потоков и т. д.)

  • Я подумал о том, чтобы клиент поставлял некоторый "статусный" объект, который может быть осмотрел после звонка, но что сделает API довольно уродливым.

Так что вы думаете по этому поводу? Как отчетливо сообщать об ошибках?

20
задан nc3b 1 July 2011 в 13:49
поделиться