В настоящее время я читаю черновик спецификации C11. Новые введенные ключевые слова: _Bool, _Alignof, _Atomic
все они выглядят как пользовательские расширения, а не как стандартные зарезервированные ключевые слова struct, union, int
.
Я понимаю, что стандарт в основном состоит из стандартизированных расширений ... но, тем не менее, это ужасно! Может быть, мы скоро закончим с __Long_Long_Reallylong_Integer_MSVC_2020_t
ползучим в стандарте!
Является ли обратная совместимость нестандартного кода единственной причиной нового стиля ключевых слов?
<stdbool.h>
заголовочный файл реализации C11 должен включать макрос препроцессора, такой как#define bool _Bool
. Это аккуратное решение, поскольку оно сохраняет обратную совместимость, но позволяет любому новому коду, который включает новый заголовочный файл, использовать более привлекательный синтаксис.Ответы:
Я полагаю, что обратная совместимость с совершенно стандартным кодом является более важной причиной.
Если вы добавите ключевое слово, которое могло быть использовано в качестве допустимого идентификатора в предыдущем коде, вы создадите массу болезненных возможных тонких ошибок, особенно в C, языке с несколько сложными правилами синтаксического анализа.
Если эти идентификаторы где-то использовались в качестве публичного интерфейса, вы добавляете боль всем пользователям таких неудачных библиотек, которые могут вообще не использовать C, но вызывают библиотеку из Ruby, Python и т. Д.
Вот почему новые ключевые слова должны выглядеть не так, как красивые слова, а скорее как болтовни, которые люди с меньшей вероятностью уже используют для других целей.
источник
Bool
в унаследованном коде, который был явно принят как логический, но никогда не являлся частью стандарта C, поэтому предположение небезопасно сделать.bool
было бы больше в духе C. Кроме того, я не полностью убежден в этом ответе, так как некрасивые слова могли также использоваться нестандартным кодом. А изменение стиля слов затрудняет распознавание стандартных слов.bool
будет добавлен к языку безоговорочно, то все проекты, имеющие свою собственную (совершенно легитимную) версиюbool
, перестанут компилироваться. Это серьезно повредит принятию пересмотра языка. Это причина того, что все новые идентификаторы берутся из зарезервированного набора (таким образом, начиная с_[capital]
). Поскольку был также большой спрос наbool
себя, это было добавлено какtypedef _Bool bool
в<stdbool.h>
.stdbool.h
или обновлять свои собственные определения типов на новый тип для поддержки своего унаследованного кода.Имена, начинающиеся с подчеркивания и заглавной буквы (и всего, что с двойным подчеркиванием), были зарезервированы для реализации компилятора / стандартной библиотеки в предыдущих стандартах.
Из зарезервированных идентификаторов C89 и C99:
Таким образом, теоретически, эти новые ключевые слова не должны использоваться в каком-либо ранее написанном коде, и это приводит к лучшей обратной совместимости, чем любое простое имя, что, вероятно, является единственной причиной.
источник