В C символы, начинающиеся с символа подчеркивания, сопровождаемые либо строчной буквой, либо другим символом подчеркивания, зарезервированы для реализации. Вы, как пользователь C, не должны создавать символы, начинающиеся с зарезервированных последовательностей. В C ++ ограничение является более строгим; вы не можете создать символ, содержащий двойной символ подчеркивания.
Учитывая:
extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;
Обозначение __const
позволяет допускать (несколько маловероятно), что компилятор, что этот код используется с поддержкой прототипов нотации, но не имеет правильного понимания стандартного ключевого слова C89 const
. Макросы autoconf
все еще могут проверить, поддерживает ли компилятор поддержку const
; этот код может использоваться со сломанным компилятором, который не имеет такой поддержки.
Использование __hostname
и __addr
- это мера защиты для вас, пользователя заголовка. Если вы скомпилируете GCC и параметр -Wshadow
, компилятор предупредит вас, когда любые локальные переменные будут затенять глобальную переменную. Если функция использовала только hostname
вместо __hostname
, и если бы у вас была функция с именем hostname()
, было бы затенение. Используя имена, зарезервированные для реализации, нет никакого конфликта с вашим законным кодом.
Использование __THROW
означает, что код может при определенных обстоятельствах быть объявлен с какой-то «спецификацией броска», , Это не стандарт C; это больше похоже на C ++. Но код может использоваться с компилятором C, если один из заголовков (или сам компилятор) определяет __THROW
для пустого или для некоторого расширения, специфичного для компилятора стандартного синтаксиса C.
Раздел 7.1.3 стандарта C (ISO 9899: 1999) гласит:
7.1.3 Зарезервированные идентификаторы
Каждый заголовок объявляет или определяет все идентификаторы, перечисленные в связанный с ним подпункт и, возможно, объявляет или определяет идентификаторы, перечисленные в соответствующем подпункте и идентификаторах будущей библиотеки, которые всегда зарезервированы либо для использования, либо для использования в качестве идентификаторов области файла.
- все идентификаторы, которые начинаются с подчеркивание и буква верхнего регистра или другое подчеркивание всегда зарезервированы для любого использования.
- Все идентификаторы, начинающиеся с подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью файлов как в обычном, так и в пространстве имен тегов.
- Каждое имя макроса в любом из следующих подпунктов (включая будущее li brary) зарезервировано для использования, как указано, если включен какой-либо из его связанных заголовков; если явно не указано иное (см. 7.1.4).
- Все идентификаторы с внешней связью в любом из следующих подпунктов (включая будущие направления библиотек) всегда зарезервированы для использования в качестве идентификаторов с внешней связью.154)
- Каждый идентификатор с областью файлов, указанный в любом из следующих подклассов (включая будущие направления библиотек), зарезервирован для использования в качестве имени макроса и как идентификатор с областью файлов в том же пространстве имен, если какой-либо из связанные с ним заголовки.
Никакие другие идентификаторы не зарезервированы. Если программа объявляет или определяет идентификатор в контексте, в котором он зарезервирован (кроме разрешенного в соответствии с 7.1.4), или определяет зарезервированный идентификатор в качестве имени макроса, поведение не определено.
Если программа удаляет (с
#undef
) любое определение макроса идентификатора в первой группе, перечисленное выше, поведение не определено.Сноска 154) Список зарезервированных идентификаторов с внешней связью включает в себя
blockquote>errno
,math_errhandling
,setjmp
иva_end
.См. также . Каковы правила использования подчеркивания в идентификаторе C ++ ; многие одинаковые правила применяются как к C, так и к C ++, хотя встроенное правило двойного подчеркивания находится только на C ++, как указано в начале этого ответа.