Я рассматриваю различные заголовки STL, снабженные компиляторами, и я не могу представить, что разработчики на самом деле пишут весь этот код вручную. Все макросы и странные имена переменных и классов - им нужно было бы запомнить все из них! Кажется, что я склонен к ошибкам. Являются ли части заголовков результатом предварительной обработки или генерации текста?
Заголовки STL написаны полностью вручную?
Ответ 1
Я поддерживал реализацию Visual Studio стандартной библиотеки С++ в течение 7 лет (VC STL была написана и лицензирована PJ Plauger из Dinkumware еще в середине 90-х годов, и я работаю с PJP для сбора новых функций и обслуживания bugfixes), и я могу сказать, что я делаю все свое редактирование "вручную" в текстовом редакторе. Ни один из STL-заголовков или источников не генерируется автоматически (хотя исходные источники Dinkumware, которых я никогда не видел, проходят автоматическую фильтрацию, чтобы создавать настраиваемые капли для Microsoft), а материал, который проверяется в исходном элементе управления, отправляется непосредственно пользователям без любая дальнейшая модификация (теперь, то есть, ранее мы запускали их через шаг фильтрации, который вызывал множество головных болей). Я печально известен тем, что не использовал IDE/автозаполнение, хотя я использую Source Insight для просмотра базы кода (особенно, лежащей в основе CRT, чьи кишки я менее знаком), и я широко полагаюсь на grep. (И, конечно, я использую инструменты diff, мой любимый - это внутренний инструмент с именем "странный".) Я занимаюсь очень тщательным редактированием вырезания и вставки, но по-разному, как новички; Я делаю это, когда полностью понимаю структуру кода, и я хочу точно воспроизвести его части, не покидая ничего. (Например, для разных контейнеров нужны очень похожие механизмы для работы с распределителями, вероятно, они должны быть централизованы, но в то же время, когда мне нужно исправить basic_string, я проверю, что вектор правильный, а затем скопируйте его механизмы.) Я создал код, возможно, дважды - один раз, когда штампование прозрачных операторных функторов С++ 14, которые я разработал (плюс < > , умножает < > , больше < > и т.д., является очень повторяющимся) и снова при реализации/предлагая переменные шаблоны для типов типов (недавно проголосовали за техническую спецификацию Основы библиотеки, вероятно, предназначенные для С++ 17). IIRC, я написал фактическую программу для операторных функторов, в то время как я использовал sed для переменных шаблонов. В обычном текстовом редакторе, который я использую (Metapad), есть возможности поиска и замены, которые являются весьма полезными, хотя и более слабыми, чем прямые регулярные выражения; Мне нужны более сильные инструменты, если я хочу реплицировать фрагменты текста (например, is_same_v = is_same <T> :: value).
Как хранители STL помнят все это? Это работа на полный рабочий день. И, конечно же, мы постоянно консультируемся со стандартным/рабочим документом для необходимых интерфейсов и поведения кода. (Недавно я обнаружил, что могу с большим трудом перечислить все 50 штатов США из памяти, но я, конечно же, не смог бы перечислять все алгоритмы STL из памяти. Однако я запомнил самое длинное имя, как бесполезную мелочь.: → )
Ответ 2
Взгляды этого в каком-то смысле были странными. Стандартная библиотека и код там должны избегать конфликтов с именами, используемыми в пользовательских программах, включая макросы, и почти нет ограничений относительно того, что может быть в пользовательской программе.
Они, скорее всего, написаны вручную, и, как говорили другие, если вы потратите некоторое время на их изучение, вы поймете, что означают соглашения кодирования, как называются переменные и так далее. Одним из немногих ограничений является то, что пользовательский код не может использовать идентификаторы, начинающиеся с _
, за которыми следует заглавная буква или __
(два последовательных символа подчеркивания), поэтому вы найдете много имен в стандартных заголовках, которые выглядят как _M_xxx
или __yyy
, и сначала это может удивить, но через некоторое время вы просто проигнорируете префикс...