Получение строки с завершающим нулем



 

Несмотря на неоспоримую полезность объектов типа string , возможны ситуации, когда вам придется получать из такого объекта символьный массив с завершающим нулем, т.е. его версию С‑строки. Например, вы могли бы использовать string ‑объект для создания имени файла. Но, открывая файл, вам нужно задать указатель на стандартную строку с завершающим нулем. Для решения этой проблемы и используется функция‑член c_str() . Вот как выглядит ее прототип:

 

 

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

 

Хранение строк в других контейнерах

 

Поскольку класс string определяет тип данных, можно создать контейнеры, которые будут содержать объекты типа string . Рассмотрим, например, более удачный вариант программы‑словаря, которая была показана выше.

 

И еще об STL

 

Библиотека STL – важная составляющая языка C++. Многие задачи программирования можно описать, используя терминологию STL. Эта библиотека великолепно сочетает силу своих средств с гибкостью их применения. Несмотря на то что ее синтаксис немного сложноват, он быстро осваивается. Ни один уважающий себя С++‑программист не может пренебречь возможностями библиотеки STL, поскольку она – не только настоящее, но и будущее С++‑программирования.

 

Глава 22: Препроцессор C++

 

Заключительная глава книги посвящена описанию препроцессора C++. Препроцессор C++ – это часть компилятора, которая подвергает вашу программу различным текстовым преобразованиям до реальной трансляции исходного кода в объектный. Программист может давать препроцессору команды, называемые директивами препроцессора (preprocessor directives), которые, не являясь формальной частью языка C++, способны расширить область действия его среды программирования.

Препроцессор C++ включает следующие директивы.

 

 

Как видите, все директивы препроцессора начинаются с символа '#' .Теперь рассмотрим каждую из них в отдельности.

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

 

Директива #define

 

Директива #define определяет имя макроса.

Директива #define используется для определения идентификатора и символьной последовательности, которая будет подставлена вместо идентификатора везде, где он встречается в исходном коде программы. Этот идентификатор называется макроименем, а процесс замены – макроподстановкой (реализацией макрорасширения). Общий формат использования этой директивы имеет следующий вид.

 

 

Обратите внимание на то, что здесь нет точки с запятой. Заданная последовательность_символов завершается только символом конца строки. Между элементами макроимя (имя_макроса) и последовательность_символов может быть любое количество пробелов.

Итак, после включения этой директивы каждое вхождение текстового фрагмента, определенное как макроимя , заменяется заданным элементом последовательность_символов . Например, если вы хотите использовать слово UP в качестве значения 1 и слово DOWN в качестве значения 0 , объявите такие директивы #define .

 

 

Данные директивы вынудят компилятор подставлять 1 или 0 каждый раз, когда в файле исходного кода встретится слово UP или DOWN соответственно. Например, при выполнении инструкции:

 

 

На экран будет выведено следующее:

 

 

После определения имени макроса его можно использовать как часть определения других макроимен. Например, следующий код определяет имена ONE , TWO и THREE и соответствующие им значения.

 

 

Важно понимать, что макроподстановка – это просто замена идентификатора соответствующей строкой. Следовательно, если вам нужно определить стандартное сообщение, используйте код, подобный этому.

 

 

Препроцессор заменит строкой "Введите имя файла" каждое вхождение идентификатора GETFILE . Для компилятора эта cout‑инструкция

 

 

в действительности выглядит так.

 

 

Никакой текстовой замены не произойдет, если идентификатор находится в строке, заключенной в кавычки. Например, при выполнении следующего кода

 

 

на экране будет отображена эта информация

 

 

а не эта:

 

 

Если текстовая последовательность не помещается на строке, ее можно продолжить на следующей, поставив обратную косую черту в конце строки, как показано в этом примере.

 

 

Среди С++‑программистов принято использовать для макроимен прописные буквы. Это соглашение позволяет с первого взгляда понять, что здесь используется макроподстановка. Кроме того, лучше всего поместить все директивы #define в начало файла или включить в отдельный файл, чтобы не искать их потом по всей программе.

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

 

 

Важно! Важно помнить, что в C++ предусмотрен еще один способ определения констант, который заключается в использовании спецификатора const. Однако многие программисты "пришли" в C++ из С‑среды, где для этих целей обычно использовалась директива #define. Поэтому вам еще часто придется с ней сталкиваться в С++‑коде.

 


Дата добавления: 2018-09-22; просмотров: 277; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!