Почему уродливые ключевые слова в C11?


15

В настоящее время я читаю черновик спецификации C11. Новые введенные ключевые слова: _Bool, _Alignof, _Atomicвсе они выглядят как пользовательские расширения, а не как стандартные зарезервированные ключевые слова struct, union, int.

Я понимаю, что стандарт в основном состоит из стандартизированных расширений ... но, тем не менее, это ужасно! Может быть, мы скоро закончим с __Long_Long_Reallylong_Integer_MSVC_2020_tползучим в стандарте!

Является ли обратная совместимость нестандартного кода единственной причиной нового стиля ключевых слов?


2
Нет, я бы не стал беспокоиться о таких длинных типах. Количество букв и цифр комбинаций _, az, AZ и 0-9 означает, что они, вероятно, будут просто короткими и их будет трудно запомнить.
Нейл

2
Более привлекательный синоним для каждого ключевого слова часто определяется в соответствующем стандартном файле заголовка библиотеки. Например, любой <stdbool.h>заголовочный файл реализации C11 должен включать макрос препроцессора, такой как #define bool _Bool. Это аккуратное решение, поскольку оно сохраняет обратную совместимость, но позволяет любому новому коду, который включает новый заголовочный файл, использовать более привлекательный синтаксис.
andrew.punnett

Ответы:


20

Я полагаю, что обратная совместимость с совершенно стандартным кодом является более важной причиной.

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

Если эти идентификаторы где-то использовались в качестве публичного интерфейса, вы добавляете боль всем пользователям таких неудачных библиотек, которые могут вообще не использовать C, но вызывают библиотеку из Ruby, Python и т. Д.

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


Следует отметить, что вопрос касался C, а не C ++, а не его значения. В вашем ответе объясняется причина, по которой новый вышеупомянутый тип будет назван как-то, чтобы избежать использования, что вызывает конфликт с пользовательским типом Boolв унаследованном коде, который был явно принят как логический, но никогда не являлся частью стандарта C, поэтому предположение небезопасно сделать.
Ramhound

1
@Ramhound, IMHO, boolбыло бы больше в духе C. Кроме того, я не полностью убежден в этом ответе, так как некрасивые слова могли также использоваться нестандартным кодом. А изменение стиля слов затрудняет распознавание стандартных слов.
Vorac

6
@Vorac: Проблема в том, что если он boolбудет добавлен к языку безоговорочно, то все проекты, имеющие свою собственную (совершенно легитимную) версию bool, перестанут компилироваться. Это серьезно повредит принятию пересмотра языка. Это причина того, что все новые идентификаторы берутся из зарезервированного набора (таким образом, начиная с _[capital]). Поскольку был также большой спрос на boolсебя, это было добавлено как typedef _Bool boolв <stdbool.h>.
Барт ван Инген Шенау

1
@BartvanIngenSchenau - Позволяет пользователям заменять свои собственные определения типов логического значения на содержащиеся в них stdbool.hили обновлять свои собственные определения типов на новый тип для поддержки своего унаследованного кода.
Ramhound

1
@Ramhound - люди с переменными, которые конфликтуют с новыми ключевыми словами C11, могут также «Так не использовать это?». Существует флаг компиляции std = xxx, чтобы предотвратить любые конфликты с новыми языковыми стандартами.
Скутер

8

Имена, начинающиеся с подчеркивания и заглавной буквы (и всего, что с двойным подчеркиванием), были зарезервированы для реализации компилятора / стандартной библиотеки в предыдущих стандартах.

Из зарезервированных идентификаторов C89 и C99:

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

Таким образом, теоретически, эти новые ключевые слова не должны использоваться в каком-либо ранее написанном коде, и это приводит к лучшей обратной совместимости, чем любое простое имя, что, вероятно, является единственной причиной.


4
Вы должны процитировать и, возможно, дать ссылку или назвать соответствующий раздел стандартов, чтобы другие могли быстро проверить ваше утверждение. Это улучшит ваш ответ.
SpaceTrucker
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.