Вот что OpenBSD cdefs.h
может сказать о __ISO_C_VISIBLE
и некоторых связанных макросах:
/*
* "The nice thing about standards is that there are so many to choose from."
* There are a number of "feature test macros" specified by (different)
* standards that determine which interfaces and types the header files
* should expose.
*
* Because of inconsistencies in these macros, we define our own
* set in the private name space that end in _VISIBLE. These are
* always defined and so headers can test their values easily.
* Things can get tricky when multiple feature macros are defined.
* We try to take the union of all the features requested.
*
* The following macros are guaranteed to have a value after cdefs.h
* has been included:
* __POSIX_VISIBLE
* __XPG_VISIBLE
* __ISO_C_VISIBLE
* __BSD_VISIBLE
*/
Этот конкретный cdefs.h
устанавливает __ISO_C_VISIBLE
в соответствии с любым POSIXУровень спецификации настроен.
Таким образом, это макросы, которые BSD использует, чтобы попытаться «сжать» другие различные функциональные макросы, используемые в мире Unix, чтобы сконфигурировать среду сборки в более управляемый набор, на который могут опираться другие заголовки.,
Например, правильная установка макроса __ISO_C_VISIBLE
(что пользователь будет делать косвенно, устанавливая другие документированные макросы функций) позволит старым программам, имена которых могут конфликтовать с именами C99, продолжать чистую компиляцию - еслисборка настроена правильно, эти конфликтующие имена C99 не будут «активированы», использование этих имен в программе пользователя не будет конфликтовать.
Если вы посмотрите в assert.h
файл для этого отбрасывания исходного кода OpenBSD вы увидите:
# if __ISO_C_VISIBLE >= 1999
# define assert(e) ((e) ? (void)0 : __assert2(__FILE__, __LINE__, __func__, #e))
# else
# define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, #e))
# endif
Итак, если сборка сконфигурирована для использования функций C99, макрос assert
воспользуется функцией __func__
C99, поэтому утверждение будетукажите, в какой функции было утверждение. Если сборка настроена так, чтобы указывать, что функции C99 не должны использоваться, assert()
этого не сделает.
Обратите внимание, что эти макросы не являются общим стандартом - они кажутсябыть в основном в мире BSD, но я уверен, что вы найдете другие области, где они могут быть использованы (возможно, потому что файлы получили боотвез от БСД).