Systemverilog темы общения с использованием почтового ящика

В 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) Список зарезервированных идентификаторов с внешней связью включает в себя errno, math_errhandling, setjmp и va_end.

blockquote>

См. также . Каковы правила использования подчеркивания в идентификаторе C ++ ; многие одинаковые правила применяются как к C, так и к C ++, хотя встроенное правило двойного подчеркивания находится только на C ++, как указано в начале этого ответа.

0
задан rosepark222 18 January 2019 в 06:43
поделиться