Примеры

Языки C и C++ тесно связаны. На «сях» написана бóльшая часть существующего на сегодняшний день программного обеспечения. Что же касается C++, то этот язык разработан как объектно-ориентированное «расширение» языка Си, в силу чего любая корректная программа на языке Си является корректной программой на языке C++, обратное неверно. C++ значительно упрощает разработку программного обеспечения за счёт появления объектно-ориентированного подхода, шаблонов, перегрузки операторов, контейнеров STL и других «примочек», однако, за простоту для программиста приходится платить — исполняемый код, генерируемый компилятором C++, «сложнее» для ЭВМ, нежели код, сформированный компилятором C. В особенности это касается STL. Тем не менее, хорошо написанный код на C++ «кладёт на лопатки» C# и Java, которым свойственно убойное потребление ресурсов в силу их совершенно идиотского принципа работы.

Наиболее известным компилятором языка C++ (точнее, парой компиляторов, предназначенных для языков Си и C++) является gcc от проекта GNU. Существует Windows-порт этого компилятора, распространяемый под названием MinGW. Скачать MinGW можно отсюда.

Увы, я не представляю, как можно сколько-нибудь комфортно работать в среде ОС Microsoft Windows, и не имею малейшего понятия о том, как в ней осуществляется запись видео с экрана, поэтому все примеры я демонстрирую с использованием Arch Linux, однако, все описанные принципы распространяются и на MinGW.

Рассмотрим 3 простых программы “Hello, world”. Первая из них написана на Си, вторая — на C++, третья — на C++ с использованием класса.


Эти три примера демонстрируют основы работы с компилятором. В задачи компилятора входят трансляция исходного кода в объектные файлы (с расширением .o) и при необходимости — вызов компоновщика, «собирающего» из объектных файлов исполняемый файл формата elf или PE, в зависимости от операционной системы. Исполняемые файлы формата PE имеют ресширения .exe, исполняемые файлы elf не имеют расширений (это видно в видео).

При сборке первого и второго примеров мы не указали компилятору флаг -c, означающий, что требуется произвести лишь компиляцию, без компоновки. Третий пример чуть сложнее — в нём мы отдельно скомпилировали main.cpp в main.o, hello.cpp в hello.o, затем скомпоновали эти два объектных файла в один исполняемый файл hello. При разработке в IDE наподобии Visual Studio эти этапы проходят в фоне, незаметно для программиста. Плюс это или минус — судить вам. Я считаю это несомненным минусом, приводящим к потере контроля над процессом компиляции. Гораздо проще знать нужные флаги компилятора и при необходимости задавать их самостоятельно. Наконец, если всё-таки нужно автоматизировать сборку, то существуют специализированные решения, входящие в пакеты GNU autotools (autoconf, automake и другие) и Qt (qmake). Впрочем, для столь простых приложений, как “Hello, world” (и даже чуть-чуть более сложных), наверное, наилучшим решением будет непосредственное написание сценариев (пакетных файлов) для сборки.

Но давайте вернёмся к голым «сям» и попробуем написать нечто более существенное, нежели “Hello, world”. В качестве примера возьмём библиотеку SQLite, реализующую встраиваемую реляционную СУБД. Это очень полезная библиотека, по своей полезности она сравнима разве что с PCRE. Она позволяет легко организовать хранение данных в файлах.


В этом примере мы выполнили один SQL-запрос над базой данных data.db, которую SQLite создало для нас автоматически. Это был очень простой запрос, не порождающий какой-то результат, но, конечно же, можно выполнять произвольные запросы. Если запрос порождает какой-то результат, то его можно легко извлечь из переменной statement. О том, как это сделать, написано в официальной документации SQLite. Ещё одна важная деталь, делающая SQLite удобным для встраивания, заключается в том, что запрос вида “CREATE TABLE IF NOT EXISTS …” действительно создаёт таблицу только в случае её отсутствия, поэтому нет необходимости вручную проверять, существует ли таблица, или её необходимо инициализировать. Вместо этого можно выполнять такой запрос каждый раз при запуске программы.

Если вам больше по вкусу C++, ничто не мешает написать класс-обёртку поверх API SQLite и в дальнейшем использовать его в своих проектах. Тогда станет возможным работать с БД с удобством.

SQLite *db = new SQLite("data.db");
SQLiteStatement *statement = db->prepare("SELECT def FROM foo");
while(statement->next()) {
	std::cout << statement->asString("def") << std::endl;
}
statement->finalize();

Часто бывает необходимо написать графическое приложение с кнопками, переключателями, полями ввода и другими стандартными элементами GUI. И тут тоже приходят на помощь полезные сторонние библиотеки — GTK и Qt. Главная «изюминка» этих проектов заключается в том, что они инкапсулируют в себя взаимодействие с системными API Windows и X11, предоставляя для работы с ними один общий API-обёртку. Это делает возможной разработку графического программного обеспечения, не привязанного к конкретной операционной системе. Недостаток у этих проектов тоже один на двоих — размер. В основном это имеет значение лишь для пользователей ОС Windows, так как в ОС семейства UNIX эти библиотеки обычно установлены в системе «из коробки», на Windows же они должны предоставляться вместе с приложением.

Остаётся только добавить о видеофайлах. Если по каким-то причинам вас не устраивает онлайн-просмотр оных, вы можете скачать их по следующим ссылкам:

  1. Hello, world
  2. Using SQLite

Комментарии запрещены.