У меня есть пара предложений.
Предложение # 1 - Использовать пользовательские ошибки.Я знаю, что вы указали, что предпочли бы не использовать это.Я понимаю, что вы обеспокоены тем, что errno будет забит в многопоточной среде, но я ожидаю, что каждый поток должен иметь свое собственное хранилище для errno.Следующая ссылка http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?errno+3 предполагает, что это довольно просто сделать.
Что касается структурирования пользовательских значений errno, вы всегда можете разделить errno на две части ... номер модуля икод ошибки модуля.
eg.
#define MODULE_NAME_error_code ((MODULE_NUMBER << 16) | (error_code))
В случае обнаружения ошибок в вашей библиотеке, вы можете затем установить errno на желаемое значение.Если имеется несколько модулей, это может помочь определить проблемную область.Конечно, если ваша библиотека должна использоваться с другими, которые используют этот метод, то требуется некоторая форма синхронизации пользовательских errno.
Предложение # 2 - Пусть ваши подпрограммы возвращают 0в случае успеха с пользовательским ненулевым значением при возврате, и пусть один из параметров будет указателем на значение, которое вы хотите установить.Ошибки могут быть легко обнаружены;однако их документирование может быть проблематичным, если у вас есть глубокие деревья вызовов, использующие эту методологию.
Надеюсь, это поможет.