Согласно стандарту C макрос errno
объявлен в errno.h
, и вы должны явно указать errno.h
, если хотите написать переносимую программу, которая использует errno
. Об этом говорится в справочном руководстве. (Это не говорит о том, что вам нужно включить errno.h
, чтобы использовать perror
. Иногда в разделе «Синопсис» рассказывается о других связанных библиотечных возможностях.)
Ничто в стандарте не определяет, что такое определение Макрос errno
находится или где именно в реализации вы можете найти любые объекты, на которые ссылается расширение этого определения. Реализация perror
, очевидно, должна иметь возможность доступа к любому объекту, на который ссылается errno
, но, поскольку он не должен быть переносимым, совершенно не определено, как это работает.
В частности, последние стандарты C требуют, чтобы объект errno
ссылался на локальный поток , чтобы каждый поток имел свой собственный объект errno
. (Если бы это было не так, механизм был бы по существу непригодным для многопоточного кода.) Точная реализация локального хранилища потока также не определена стандартом, и в конкретной реализации он может быть отображен на некоторое средство, предоставляемое базовая операционная система.