Почему в C есть ключевые слова, начинающиеся с подчеркивания - PullRequest
8 голосов
/ 19 мая 2019

Большинство ключевых слов в C (или на любом другом языке) начинаются с буквы.Но есть некоторые ключевые слова, которые начинаются с подчеркивания?Ключевые слова: _Alignas, _Alignof, _Atomic, _Bool, _Complex, _Generic, _Imaginary, _Noreturn, _Static_assert и _Thread_local.

Я нахожу это удивительно странным.Если бы это была скрытая глобальная константа или внутренняя функция, которая на самом деле не является частью API, я бы это понял.Но это ключевые слова .

Мне кажется странным, когда в C действительно есть макросы с именами bool и static_assert, и что их реализации используют ключевые слова.

Ответы [ 3 ]

10 голосов
/ 20 мая 2019

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

При установке стандарта C или обновлении старого стандарта важной целью является не «сломать» старый код.Желательно, чтобы код, который работал с предыдущими компиляторами, продолжал работать с новыми версиями языка C.

Введение нового ключевого слова (или любого нового определения или значения слова) может сломать старый код, поскольку, когдапри компиляции слово будет иметь новое ключевое слово, а не идентификатор, означающий то же, что и предыдущие компиляторы.Код должен быть отредактирован.В дополнение к затратам людей, которые платят за редактирование кода, это также может привести к появлению ошибок, если будут допущены какие-либо ошибки.

Для решения этой проблемы было создано правило, согласно которому идентификаторы, начинающиеся с подчеркивания, были зарезервированы.Создание этого правила не сломало много старого программного обеспечения, так как большинство людей, пишущих программное обеспечение, предпочитают использовать идентификаторы, начинающиеся с букв, а не подчеркивания.Это правило дает стандарту C новую возможность: используя подчеркивание при добавлении новых ключевых слов или других новых значений для слов, он может делать это, не нарушая старый код, если этот старый код подчиняется правилу.

Новые версии стандарта C иногда вводят новые значения для слов, которые не начинаются с подчеркивания, например bool.Однако эти новые значения обычно не вводятся в основной язык.Скорее они вводятся только в новых заголовках.При создании типа bool стандарт C предоставил новый заголовок <stdbool.h>.Поскольку старый код не может включать <stdbool.h>, так как он не существовал на момент написания кода, определение bool в <stdbool.h> не нарушало бы старый код.В то же время он дает программистам, пишущим новый код, возможность использовать новую функцию bool, включая <stdbool.h>.

6 голосов
/ 20 мая 2019

В стандарте зарезервировано любое имя, начинающееся с двойного подчеркивания или подчеркивания , за которым следует заглавная буква .Это полезно, потому что в C отсутствуют именованные пространства имен.Зарезервировав все такие символы, можно ввести в язык новые и специфичные для реализации ключевые слова, не конфликтуя с символами, определенными в существующем коде.

Макросы, такие как bool и static_assert, представляют собой « удобные макросы », они позволяют использовать зарезервированные символы ключевых слов без подчеркивания и заглавных букв при небольшом риске именистолкновение.Однако они предоставляют средства для разрешения конфликта имен, поскольку в отличие от ключевого слова макрос может содержать #undef или заголовок, который его определяет, исключен, а внутреннее ключевое слово используется напрямую.Более того, неизмененный унаследованный код не будет нарушен, поскольку по определению он не будет включать заголовки, которые не существовали на момент написания

Неукрашенные ключевые слова были определены в языке с момента создания языка (за исключениемinline и restrict определены с C99), поэтому не вызовет конфликта с устаревшими символами кода.Все ключевые слова _Xxxx были определены в или после C99.

В отличие от многих распространенных сегодня языков, C существует с 1970-х годов и стандартизирован с 1989 года - существует огромный объем существующего кода, который должен оставаться компилируемым на современных компиляторах, в то же время язык не может оставатьсябез изменений - если бы это было так, оно больше не могло бы быть таким распространенным.

1 голос
/ 17 июня 2019

Эрик и Клиффорд дали хорошие ответы, но я добавляю цитату из стандарта C11, чтобы поддержать ее.

  • Все идентификаторы, которые начинаются с подчеркивания и либо с заглавной буквы, либо с другойподчеркивание всегда зарезервировано для любого использования.
  • Все идентификаторы, начинающиеся с подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью действия файла как в обычном пространстве, так и в пространстве имен тега.

https://port70.net/~nsz/c/c11/n1570.html#7.1.3

Можно также учитывать это:

Могут быть добавлены имена typedef, начинающиеся с int или uint и заканчивающиеся _tк типам, определенным в заголовке stdint.h.Имена макросов, начинающиеся с INT или UINT и заканчивающиеся _MAX, _MIN или _C, могут быть добавлены в макросы, определенные в заголовке stdint.h.

https://port70.net/~nsz/c/c11/n1570.html#7.31.10p1

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