Макрос: ISO_C_VISIBLE - PullRequest
       5

Макрос: ISO_C_VISIBLE

1 голос
/ 11 марта 2012

Какова цель этого макроса: ISO_C_VISIBLE? Я нашел это в файле assert.h.

Используется ли он для того, чтобы знать, какую версию C мы используем?

Ответы [ 3 ]

3 голосов
/ 11 марта 2012

Вот что 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, но я уверен, что вы найдете другие области, где они могут быть использованы (возможно, потому что файлы получили боотвез от БСД).

1 голос
/ 11 марта 2012

Поиск в Google по запросу «ISO_C_VISIBLE» поднимает этот вопрос и несколько результатов для операционной системы Nokia Symbian.Только описание говорит:

__ ISO_C_VISIBLE 1999

Описание

Значение макроса для включения ISO_C_VISIBLE

Я предполагаю, что значение 1999 относится к стандарту ISO C 1999 года, но я не вижу дальнейшего объяснения того, что это значит или как оно используется, или различия между __ISO_C_VISIBLE и ISO_C_VISIBLE.Это кажется странным, потому что Symbian в основном реализован и запрограммирован на C ++, а не на C. И я, конечно, не ожидал бы, что он будет определен в <assert.h> (при условии, что, когда вы говорите assert.h, вы ссылаетесь на заголовок, который включен в#include <assert.h>).

Если вы не работаете с Symbian, то я понятия не имею, что это может быть.

Правильный способ определить, какому стандарту C соответствует ваша реализация, этоиспользуйте предопределенные макросы STDC и STDC_VERSION .Для соответствующей C90 или более поздней реализации __STDC__ расширяется до 1.Для реализации C99 __STDC_VERSION__ расширяется до 199901L.Для C11 он, вероятно, расширяется до 201112L, но я не видел реальной копии нового стандарта.

0 голосов
/ 11 марта 2012

Эти макросы используются для настройки системы, компилирующей код.Информация, полученная от компилятора, хранится в них, поэтому код формируется в соответствии с конструкциями, поддерживаемыми платформой хостинга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...