Стандартная библиотека языка Си

Поделись знанием:
Перейти к: навигация, поиск
Стандартная библиотека
языка программирования С

Стандартной библиотекой языка Си (также известная как libc, crt) называется часть стандарта ANSI C, посвященная заголовочным файлам и библиотечным подпрограммам. Является описанием реализации общих операций, таких как обработка ввода-вывода и строк, в языке программирования Си. Стандартная библиотека языка Си — это описание программного интерфейса, а не настоящая библиотека, пригодная для использования в процессе компиляции.





Структура

Имя и характеристики каждой функции указываются в файле, именуемом заголовочным файлом, но текущая реализация функций описана отдельно в библиотечном файле. Наименование и возможности заголовочных файлов становятся общими, но организация библиотек по-прежнему остается разнотипной. Стандартная библиотека обычно поставляется вместе с компилятором. Так как компиляторы языка Си часто обеспечивают расширенную функциональность, не определенную стандартом ANSI C, стандартная библиотека одного компилятора несовместима со стандартными библиотеками других компиляторов.

Мнения о структуре

Большая часть стандартной библиотеки языка Си производит впечатление удачно спроектированной. Некоторые отдельные части, дававшие преимущество в прошлом, могут провоцировать ошибки. Функции строкового ввода gets() (и применение scanf() для считывания вводимых строк) являются источником множества переполнений буфера, поэтому большинство руководств по программированию советуют избегать подобных приемов. Функция strcpy() также весьма печально знаменита. Ещё одной неоднозначной функцией является strtok() — функция, разработанная как простейший лексический анализатор, но имеющая множество «подводных камней» и потому весьма трудная в использовании.

Выбор применения типа size_t вместо int для числа элементов, указанных для fread() и fwrite() является несовместимым с разработанной общей семантикой для size_t (для представления количества байтов).К:Википедия:Статьи без источников (тип: не указан)[источник не указан 4644 дня]

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

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

История

Язык программирования Си до стандартизации не обеспечивал встроенной функциональности, как, например, операции ввода-вывода (в отличие от таких традиционных языков, как Кобол и Фортран). Позже, в сообществе программистов, работавших с языком Си, зародились идеи, которые реализовались в то, что мы сейчас называем Стандартной библиотекой языка Си, для поддержки этой функциональности. Большинство этих идей в итоге объединились в определении стандарта языка программирования Си.

И Unix, и Си были созданы в AT&T’s Bell Laboratories в конце 1960-х — начале 1970-х. В 1970-е язык программирования Си начал пользоваться невероятной популярностью. Множество университетов и организаций начали создание собственных вариантов языка, более подходящих для собственных нужд. С началом 1980-х проблемы совместимости между различными реализациями языка Си стали слишком очевидными. В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет для принятия стандарта языка Си, известный как «ANSI Си». Эта работа вылилась в создание так называемого стандарта C89 в 1989. Часть итогового стандарта была набором библиотек, названная Стандартная библиотека ANSI Си.

Последующие версии стандарта языка Си добавляли некоторые новые и наиболее полезные заголовочные файлы в библиотеку. Поддержка этих новых расширений зависела от реализации.

Заголовочные файлы <iso646.h>, <wchar.h> и <wctype.h> были добавлены в Приложении 1 (сокращенно NA1) — дополнении к Стандарту языка Си, ратифицированному в 1995.

Заголовочные файлы <complex.h>, <fenv.h>, <inttypes.h>, <stdbool.h>, <stdint.h> и <tgmath.h> были добавлены в C99, версии Стандарта языка Си, опубликованном в 1999.

Стандарт ANSI

Стандартная библиотека ANSI Си состоит из 24 заголовочных файлов, каждый из которых можно подключать к программному проекту при помощи одной директивы. Каждый заголовочный файл содержит объявления одной или более функций, определения типов данных и макросы. Содержание этих заголовочных файлов перечисляется ниже.

В сравнении с некоторыми другими языками (например Java) стандартная библиотека крайне мала. Библиотека обеспечивает поддержку основного набора математических функций, обработку строк, конвертацию типов, файловый и консольный ввод-вывод. Она не содержит стандартный набор «контейнерных типов» как стандартная библиотека шаблонов языка C++, компоненты для работы с графическим пользовательским интерфейсом (GUI), сетью и прочей разнообразной функциональности, которую Java поддерживает по стандарту. Главным преимуществом маленькой стандартной библиотеки является упрощение работы с окружением ANSI Си по сравнению с другими языками, а следовательно и упрощение портирования программ на языке Си на новые платформы.

Множество прочих библиотек было разработано для поддержки схожей функциональности, обеспечиваемой другими языками в их стандартных библиотеках. Например, в проекте разработки окружения рабочего стола GNOME был разработан набор графических инструментов GTK+ и GLib — библиотека контейнерных структур данных, как впрочем и множество других известных примеров. Разнообразие доступных библиотек означает, что некоторые инструменты верхнего уровня, со временем подтвердили свою полезность. Значительным минусом является то, что они часто не слишком успешно взаимодействуют друг с другом, поэтому программистам зачастую привычнее работать с различными наборами библиотек, а их наборы могут быть доступны на различных специфических платформах.

Библиотечные заголовочные файлы ANSI Си c дополнениями C99 и C11

<assert.h> Содержит макрос утверждений, используемый для обнаружения логических и некоторых других типов ошибок в отлаживаемой версии программы.
<complex.h> Набор функций для работы с комплексными числами. (Появилось в C99)
<ctype.h> Содержит функции, используемые для классификации символов по их типам или для конвертации между верхним и нижним регистрами независимо от используемой кодировки (обычно ASCII или одно из её расширений, хотя есть и реализации, использующие EBCDIC).
<errno.h> Для проверки кодов ошибок, возвращаемых библиотечными функциями.
<fenv.h> Для управления средой, использующей числа с плавающей точкой. (Появилось в C99)
<float.h> Содержит заранее определенные константы, описывающие специфику реализации свойств библиотеки для работы с числами с плавающей точкой, как, например, минимальная разница между двумя различными числами с плавающей точкой (_EPSILON), максимальное число цифр точности (_DIG) и область допустимых чисел (_MIN, _MAX).
<inttypes.h> Для точной конвертации целых типов. (Появилось в C99)
<iso646.h> Для программирования в кодировке ISO 646. (Появилось в NA1)
<limits.h> Содержит заранее заданные константы, определяющие специфику реализации свойств целых типов, как, например, область допустимых значений (_MIN, _MAX).
<locale.h> Для setlocale() и связанных констант. Используется для выбора соответствующего языка.
<math.h> Для вычисления основных математических функций
<setjmp.h> Объявляет макросы setjmp и longjmp, используемые для нелокальных переходов
<signal.h> Для управления обработкой сигналов
<stdarg.h> Для доступа к различному числу аргументов, переданных функциям.
<stdbool.h> Для булевых типов данных. (Появилось в C99)
<stdint.h> Для определения различных типов целых чисел. (Появилось в C99)
<stddef.h> Для определения нескольких стандартных типов и макросов.
<stdio.h> Реализует основные возможности ввода и вывода в языке Си. Этот файл содержит весьма важную функцию printf.
<stdlib.h> Для выполнения множества операций, включая конвертацию, генерацию псевдослучайных чисел, выделение памяти, контроль процессов, окружения, сигналов, поиска и сортировки.
<string.h> Для работы с различными видами строк.
<tgmath.h> Для типовых математических функций. (Появилось в C99)
<threads.h> Заголовочный файл <threads.h> наряду с <stdatomic.h> предоставляет поддержку для параллельного программирования. (Появилась в C11)
<time.h> Для конвертации между различными форматами времени и даты.
<wchar.h> Для обработки «широких» потоков и нескольких видов строк при помощи «широких» символов (поддержка набора языков). (Появилось в NA1)
<wctype.h> Для классификации «широких» символов. (Появилось в NA1)

Стандартная библиотека Си в других языках

Некоторые языки обеспечивают функциональность стандартной библиотеки Си при помощи своих собственных библиотек. Библиотека может быть адаптирована для структур языка, но семантика операций остается схожей. Язык программирования C++, например, содержит функциональность стандартной библиотеки ANSI Си в пространстве имен std (например, std::printf, std::atoi, std::feof и т. д.), в заголовочных файлах со схожими именами как в Си («cstdio», «cmath», «cstdlib» и т. д.). К другим языкам, в которых применяются схожие подходы относятся, например, D и Python. В последнем, к примеру, встроенный объект file определен как «реализованный при помощи пакета stdio языка Си»[docs.python.org/lib/bltin-file-objects.html], так что доступные операции (открытие, чтение, запись и т. д.), как ожидается, должны иметь поведение как у соответствующих функций языка Си.

Общая поддержка библиотек

Пока не стандартизировано, но программы на языке Си могут зависеть от библиотек подпрограмм, которые содержат код, используемый компилятором во время работы. Код, инициализирующий процесс для операционной системы, например, перед вызовом main(), реализован в библиотеке времени исполнения языка Си (C Run-Time Library, CRT) для данной версии компилятора. Код библиотеки CRT может помочь с реализацией других особенностей языка, как например, обработка неперехваченных исключений или реализация работы с числами с плавающей точкой.

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

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

Встроенные функции компилятора

Некоторые компиляторы (например, GCC[1]) поддерживают внутренние версии множества функций Стандартной библиотеки языка Си; то есть, реализации функций записываются в компилируемый объектный модуль, а программа вызывает внутренние версии вместо функций общей библиотеки Си. Это уменьшает накладные расходы при вызове функции, особенно если вызов функции заменяется встроенными вариантами, и разрешается использование других форм оптимизации (если компилятор поддерживает управление характеристиками внутренних вариантов), но может приводить к проблемами при отладке (например, внутренние версии не могут быть заменены инструментальными версиями для проверки).

Стандартная библиотека POSIX

POSIXSUS) определяют число подпрограмм, которые могут быть доступны помимо определенных в Стандартной библиотеке языка Си; они часто реализуют аналогичную функциональность со Стандартной библиотекой с различной степенью схожести. Например, glibc реализует такие функции как fork в libc.so, но перед вызовом библиотеки потоков объединяются в glibc, хотя это заявлено как отдельная библиотека с собственным флагом линковщика. Зачастую, такая POSIX-совместимая функциональность рассматривается как часть библиотеки; соответствующая библиотека Си, таким образом, может быть идентифицирована как ANSI или ISO библиотека языка Си.

Реализации

Существует множество реализаций, поставляемых как с различными операционными системами, так и с компиляторами языка Си. На BSD системах, к примеру, системная библиотека встроена в операционную систему и поддерживается общим репозиторием исходников. На большинстве систем библиотека может быть найдена под именем «libc».

Хотя существует очень много реализаций, вот небольшой список самых популярных библиотек:

  • GNU C Library — самая распространенная реализация, используемая в Linux
  • Microsoft C Run-time Library
  • dietlibc — альтернативная небольшая реализация Стандартной библиотеки языка Си
  • uClibc — Стандартная библиотека языка Си для встраиваемых систем на базе Linux
  • Newlib — Стандартная библиотека языка Си для встраиваемых систем (MMU-less)[2]
  • klibc — применяется главным образом для загрузки Linux-систем.
  • eglibc — разновидность glibc для встраиваемых систем.

См. также

Напишите отзыв о статье "Стандартная библиотека языка Си"

Ссылки

  1. [gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Other-Builtins.html#Other-Builtins Other built-in functions provided by GCC], Руководство по GCC
  2. [www.cygwin.com/ml/newlib/2006/msg00224.html Re: Поддерживает ли Newlib процессоры mmu-less?]

Дополнительные источники

  • [www.infosys.utas.edu.au/info/documentation/C/CStdLib.html Стандартная Библиотека Языка Си]: Детальное описание заголовочных файлов
  • [www.acm.uiuc.edu/webmonkeys/book/c_guide/index.html Руководство Пользователя по работе с Библиотекой Си]
  • Microsoft [msdn.microsoft.com/en-us/library/abx4dbyh.aspx Библиотеки Запуска Языка Си] в MSDN
  • NetBSD [netbsd.gw.com/cgi-bin/man-cgi?intro+3+NetBSD-current Руководство по Библиотекам Си] и [cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/ полные исходники библиотеки Си]: Хорошие академические справочники.

Отрывок, характеризующий Стандартная библиотека языка Си

– Анна Игнатьевна Мальвинцева. Она слышала о тебе от своей племянницы, как ты спас ее… Угадаешь?..
– Мало ли я их там спасал! – сказал Николай.
– Ее племянницу, княжну Болконскую. Она здесь, в Воронеже, с теткой. Ого! как покраснел! Что, или?..
– И не думал, полноте, ma tante.
– Ну хорошо, хорошо. О! какой ты!
Губернаторша подводила его к высокой и очень толстой старухе в голубом токе, только что кончившей свою карточную партию с самыми важными лицами в городе. Это была Мальвинцева, тетка княжны Марьи по матери, богатая бездетная вдова, жившая всегда в Воронеже. Она стояла, рассчитываясь за карты, когда Ростов подошел к ней. Она строго и важно прищурилась, взглянула на него и продолжала бранить генерала, выигравшего у нее.
– Очень рада, мой милый, – сказала она, протянув ему руку. – Милости прошу ко мне.
Поговорив о княжне Марье и покойнике ее отце, которого, видимо, не любила Мальвинцева, и расспросив о том, что Николай знал о князе Андрее, который тоже, видимо, не пользовался ее милостями, важная старуха отпустила его, повторив приглашение быть у нее.
Николай обещал и опять покраснел, когда откланивался Мальвинцевой. При упоминании о княжне Марье Ростов испытывал непонятное для него самого чувство застенчивости, даже страха.
Отходя от Мальвинцевой, Ростов хотел вернуться к танцам, но маленькая губернаторша положила свою пухленькую ручку на рукав Николая и, сказав, что ей нужно поговорить с ним, повела его в диванную, из которой бывшие в ней вышли тотчас же, чтобы не мешать губернаторше.
– Знаешь, mon cher, – сказала губернаторша с серьезным выражением маленького доброго лица, – вот это тебе точно партия; хочешь, я тебя сосватаю?
– Кого, ma tante? – спросил Николай.
– Княжну сосватаю. Катерина Петровна говорит, что Лили, а по моему, нет, – княжна. Хочешь? Я уверена, твоя maman благодарить будет. Право, какая девушка, прелесть! И она совсем не так дурна.
– Совсем нет, – как бы обидевшись, сказал Николай. – Я, ma tante, как следует солдату, никуда не напрашиваюсь и ни от чего не отказываюсь, – сказал Ростов прежде, чем он успел подумать о том, что он говорит.
– Так помни же: это не шутка.
– Какая шутка!
– Да, да, – как бы сама с собою говоря, сказала губернаторша. – А вот что еще, mon cher, entre autres. Vous etes trop assidu aupres de l'autre, la blonde. [мой друг. Ты слишком ухаживаешь за той, за белокурой.] Муж уж жалок, право…
– Ах нет, мы с ним друзья, – в простоте душевной сказал Николай: ему и в голову не приходило, чтобы такое веселое для него препровождение времени могло бы быть для кого нибудь не весело.
«Что я за глупость сказал, однако, губернаторше! – вдруг за ужином вспомнилось Николаю. – Она точно сватать начнет, а Соня?..» И, прощаясь с губернаторшей, когда она, улыбаясь, еще раз сказала ему: «Ну, так помни же», – он отвел ее в сторону:
– Но вот что, по правде вам сказать, ma tante…
– Что, что, мой друг; пойдем вот тут сядем.
Николай вдруг почувствовал желание и необходимость рассказать все свои задушевные мысли (такие, которые и не рассказал бы матери, сестре, другу) этой почти чужой женщине. Николаю потом, когда он вспоминал об этом порыве ничем не вызванной, необъяснимой откровенности, которая имела, однако, для него очень важные последствия, казалось (как это и кажется всегда людям), что так, глупый стих нашел; а между тем этот порыв откровенности, вместе с другими мелкими событиями, имел для него и для всей семьи огромные последствия.
– Вот что, ma tante. Maman меня давно женить хочет на богатой, но мне мысль одна эта противна, жениться из за денег.
– О да, понимаю, – сказала губернаторша.
– Но княжна Болконская, это другое дело; во первых, я вам правду скажу, она мне очень нравится, она по сердцу мне, и потом, после того как я ее встретил в таком положении, так странно, мне часто в голову приходило что это судьба. Особенно подумайте: maman давно об этом думала, но прежде мне ее не случалось встречать, как то все так случалось: не встречались. И во время, когда Наташа была невестой ее брата, ведь тогда мне бы нельзя было думать жениться на ней. Надо же, чтобы я ее встретил именно тогда, когда Наташина свадьба расстроилась, ну и потом всё… Да, вот что. Я никому не говорил этого и не скажу. А вам только.
Губернаторша пожала его благодарно за локоть.
– Вы знаете Софи, кузину? Я люблю ее, я обещал жениться и женюсь на ней… Поэтому вы видите, что про это не может быть и речи, – нескладно и краснея говорил Николай.
– Mon cher, mon cher, как же ты судишь? Да ведь у Софи ничего нет, а ты сам говорил, что дела твоего папа очень плохи. А твоя maman? Это убьет ее, раз. Потом Софи, ежели она девушка с сердцем, какая жизнь для нее будет? Мать в отчаянии, дела расстроены… Нет, mon cher, ты и Софи должны понять это.
Николай молчал. Ему приятно было слышать эти выводы.
– Все таки, ma tante, этого не может быть, – со вздохом сказал он, помолчав немного. – Да пойдет ли еще за меня княжна? и опять, она теперь в трауре. Разве можно об этом думать?
– Да разве ты думаешь, что я тебя сейчас и женю. Il y a maniere et maniere, [На все есть манера.] – сказала губернаторша.
– Какая вы сваха, ma tante… – сказал Nicolas, целуя ее пухлую ручку.


Приехав в Москву после своей встречи с Ростовым, княжна Марья нашла там своего племянника с гувернером и письмо от князя Андрея, который предписывал им их маршрут в Воронеж, к тетушке Мальвинцевой. Заботы о переезде, беспокойство о брате, устройство жизни в новом доме, новые лица, воспитание племянника – все это заглушило в душе княжны Марьи то чувство как будто искушения, которое мучило ее во время болезни и после кончины ее отца и в особенности после встречи с Ростовым. Она была печальна. Впечатление потери отца, соединявшееся в ее душе с погибелью России, теперь, после месяца, прошедшего с тех пор в условиях покойной жизни, все сильнее и сильнее чувствовалось ей. Она была тревожна: мысль об опасностях, которым подвергался ее брат – единственный близкий человек, оставшийся у нее, мучила ее беспрестанно. Она была озабочена воспитанием племянника, для которого она чувствовала себя постоянно неспособной; но в глубине души ее было согласие с самой собою, вытекавшее из сознания того, что она задавила в себе поднявшиеся было, связанные с появлением Ростова, личные мечтания и надежды.
Когда на другой день после своего вечера губернаторша приехала к Мальвинцевой и, переговорив с теткой о своих планах (сделав оговорку о том, что, хотя при теперешних обстоятельствах нельзя и думать о формальном сватовстве, все таки можно свести молодых людей, дать им узнать друг друга), и когда, получив одобрение тетки, губернаторша при княжне Марье заговорила о Ростове, хваля его и рассказывая, как он покраснел при упоминании о княжне, – княжна Марья испытала не радостное, но болезненное чувство: внутреннее согласие ее не существовало более, и опять поднялись желания, сомнения, упреки и надежды.
В те два дня, которые прошли со времени этого известия и до посещения Ростова, княжна Марья не переставая думала о том, как ей должно держать себя в отношении Ростова. То она решала, что она не выйдет в гостиную, когда он приедет к тетке, что ей, в ее глубоком трауре, неприлично принимать гостей; то она думала, что это будет грубо после того, что он сделал для нее; то ей приходило в голову, что ее тетка и губернаторша имеют какие то виды на нее и Ростова (их взгляды и слова иногда, казалось, подтверждали это предположение); то она говорила себе, что только она с своей порочностью могла думать это про них: не могли они не помнить, что в ее положении, когда еще она не сняла плерезы, такое сватовство было бы оскорбительно и ей, и памяти ее отца. Предполагая, что она выйдет к нему, княжна Марья придумывала те слова, которые он скажет ей и которые она скажет ему; и то слова эти казались ей незаслуженно холодными, то имеющими слишком большое значение. Больше же всего она при свидании с ним боялась за смущение, которое, она чувствовала, должно было овладеть ею и выдать ее, как скоро она его увидит.
Но когда, в воскресенье после обедни, лакей доложил в гостиной, что приехал граф Ростов, княжна не выказала смущения; только легкий румянец выступил ей на щеки, и глаза осветились новым, лучистым светом.
– Вы его видели, тетушка? – сказала княжна Марья спокойным голосом, сама не зная, как это она могла быть так наружно спокойна и естественна.
Когда Ростов вошел в комнату, княжна опустила на мгновенье голову, как бы предоставляя время гостю поздороваться с теткой, и потом, в самое то время, как Николай обратился к ней, она подняла голову и блестящими глазами встретила его взгляд. Полным достоинства и грации движением она с радостной улыбкой приподнялась, протянула ему свою тонкую, нежную руку и заговорила голосом, в котором в первый раз звучали новые, женские грудные звуки. M lle Bourienne, бывшая в гостиной, с недоумевающим удивлением смотрела на княжну Марью. Самая искусная кокетка, она сама не могла бы лучше маневрировать при встрече с человеком, которому надо было понравиться.
«Или ей черное так к лицу, или действительно она так похорошела, и я не заметила. И главное – этот такт и грация!» – думала m lle Bourienne.
Ежели бы княжна Марья в состоянии была думать в эту минуту, она еще более, чем m lle Bourienne, удивилась бы перемене, происшедшей в ней. С той минуты как она увидала это милое, любимое лицо, какая то новая сила жизни овладела ею и заставляла ее, помимо ее воли, говорить и действовать. Лицо ее, с того времени как вошел Ростов, вдруг преобразилось. Как вдруг с неожиданной поражающей красотой выступает на стенках расписного и резного фонаря та сложная искусная художественная работа, казавшаяся прежде грубою, темною и бессмысленною, когда зажигается свет внутри: так вдруг преобразилось лицо княжны Марьи. В первый раз вся та чистая духовная внутренняя работа, которою она жила до сих пор, выступила наружу. Вся ее внутренняя, недовольная собой работа, ее страдания, стремление к добру, покорность, любовь, самопожертвование – все это светилось теперь в этих лучистых глазах, в тонкой улыбке, в каждой черте ее нежного лица.
Ростов увидал все это так же ясно, как будто он знал всю ее жизнь. Он чувствовал, что существо, бывшее перед ним, было совсем другое, лучшее, чем все те, которые он встречал до сих пор, и лучшее, главное, чем он сам.
Разговор был самый простой и незначительный. Они говорили о войне, невольно, как и все, преувеличивая свою печаль об этом событии, говорили о последней встрече, причем Николай старался отклонять разговор на другой предмет, говорили о доброй губернаторше, о родных Николая и княжны Марьи.
Княжна Марья не говорила о брате, отвлекая разговор на другой предмет, как только тетка ее заговаривала об Андрее. Видно было, что о несчастиях России она могла говорить притворно, но брат ее был предмет, слишком близкий ее сердцу, и она не хотела и не могла слегка говорить о нем. Николай заметил это, как он вообще с несвойственной ему проницательной наблюдательностью замечал все оттенки характера княжны Марьи, которые все только подтверждали его убеждение, что она была совсем особенное и необыкновенное существо. Николай, точно так же, как и княжна Марья, краснел и смущался, когда ему говорили про княжну и даже когда он думал о ней, но в ее присутствии чувствовал себя совершенно свободным и говорил совсем не то, что он приготавливал, а то, что мгновенно и всегда кстати приходило ему в голову.
Во время короткого визита Николая, как и всегда, где есть дети, в минуту молчания Николай прибег к маленькому сыну князя Андрея, лаская его и спрашивая, хочет ли он быть гусаром? Он взял на руки мальчика, весело стал вертеть его и оглянулся на княжну Марью. Умиленный, счастливый и робкий взгляд следил за любимым ею мальчиком на руках любимого человека. Николай заметил и этот взгляд и, как бы поняв его значение, покраснел от удовольствия и добродушно весело стал целовать мальчика.
Княжна Марья не выезжала по случаю траура, а Николай не считал приличным бывать у них; но губернаторша все таки продолжала свое дело сватовства и, передав Николаю то лестное, что сказала про него княжна Марья, и обратно, настаивала на том, чтобы Ростов объяснился с княжной Марьей. Для этого объяснения она устроила свиданье между молодыми людьми у архиерея перед обедней.
Хотя Ростов и сказал губернаторше, что он не будет иметь никакого объяснения с княжной Марьей, но он обещался приехать.
Как в Тильзите Ростов не позволил себе усомниться в том, хорошо ли то, что признано всеми хорошим, точно так же и теперь, после короткой, но искренней борьбы между попыткой устроить свою жизнь по своему разуму и смиренным подчинением обстоятельствам, он выбрал последнее и предоставил себя той власти, которая его (он чувствовал) непреодолимо влекла куда то. Он знал, что, обещав Соне, высказать свои чувства княжне Марье было бы то, что он называл подлость. И он знал, что подлости никогда не сделает. Но он знал тоже (и не то, что знал, а в глубине души чувствовал), что, отдаваясь теперь во власть обстоятельств и людей, руководивших им, он не только не делает ничего дурного, но делает что то очень, очень важное, такое важное, чего он еще никогда не делал в жизни.
После его свиданья с княжной Марьей, хотя образ жизни его наружно оставался тот же, но все прежние удовольствия потеряли для него свою прелесть, и он часто думал о княжне Марье; но он никогда не думал о ней так, как он без исключения думал о всех барышнях, встречавшихся ему в свете, не так, как он долго и когда то с восторгом думал о Соне. О всех барышнях, как и почти всякий честный молодой человек, он думал как о будущей жене, примеривал в своем воображении к ним все условия супружеской жизни: белый капот, жена за самоваром, женина карета, ребятишки, maman и papa, их отношения с ней и т. д., и т. д., и эти представления будущего доставляли ему удовольствие; но когда он думал о княжне Марье, на которой его сватали, он никогда не мог ничего представить себе из будущей супружеской жизни. Ежели он и пытался, то все выходило нескладно и фальшиво. Ему только становилось жутко.


Страшное известие о Бородинском сражении, о наших потерях убитыми и ранеными, а еще более страшное известие о потере Москвы были получены в Воронеже в половине сентября. Княжна Марья, узнав только из газет о ране брата и не имея о нем никаких определенных сведений, собралась ехать отыскивать князя Андрея, как слышал Николай (сам же он не видал ее).