{
int iterations = 0;
bool continue_loop = true;
while ( continue_loop != false )
{
iterations++;
cout "Цикл был выполнен " iterations "раз\n";
if ( iterations == 5 )
continue_loop = false;
}
return 0;
}
В этом надуманном примере цикл while выполняется пять раз, до тех пор пока переменная iterations не получит значение 5 и переменная continue_loop не станет равной false. Инструкция
iterations++;
увеличивает значение переменной iterations на единицу. (Инструкции цикла детально рассматриваются в главе 5.)
1.3. Директивы препроцессора
Заголовочные файлы включаются в текст программы с помощью
Директива #include включает в программу содержимое указанного файла. Имя файла может быть указано двумя способами:
#include some_file.h
#include "my_file.h"
Если имя файла заключено в угловые скобки (), считается, что нам нужен некий стандартный заголовочный файл, и компилятор ищет этот файл в предопределенных местах. (Способ определения этих мест сильно различается для разных платформ и реализаций.) Двойные кавычки означают, что заголовочный файл - пользовательский, и его поиск начинается с того каталога, где находится исходный текст программы.
Заголовочный файл также может содержать директивы #include. Поэтому иногда трудно понять, какие же конкретно заголовочные файлы включены в данный исходный текст, и некоторые заголовочные файлы могут оказаться включенными несколько раз. Избежать этого позволяют
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/* содержимое файла bookstore.h */
#endif
Условная директива #ifndef проверяет, не было ли значение BOOKSTORE_H определено ранее. (BOOKSTORE_H - это константа препроцессора; такие константы принято писать заглавными буквами.) Препроцессор обрабатывает следующие строки вплоть до директивы #endif. В противном случае он пропускает строки от #ifndef до # endif.
Директива
#define BOOKSTORE_H
определяет константу препроцессора BOOKSTORE_H. Поместив эту директиву непосредственно после директивы #ifndef, мы можем гарантировать, что содержательная часть заголовочного файла bookstore.h будет включена в исходный текст только один раз, сколько бы раз ни включался в текст сам этот файл.
Другим распространенным примером применения условных директив препроцессора является включение в текст программы отладочной информации. Например:
int main()
{
#ifdef DEBUG
cout "Начало выполнения main()\n";
#endif
string word;
vectorstring text;
while ( cin word )
{
#ifdef DEBUG
cout "Прочитано слово: " word "\n";
#endif
text.push_back(word);
}
// ...
}
Если константа DEBUG не определена, результирующий текст программы будет выглядеть так:
int main()
{
string word;
vectorstring text;
while ( cin word )
{
text.push_back(word);
}
// ...
}
В противном случае мы получим:
int main()
{
cout "Начало выполнения main()\n";
string word;
vectorstring text;
while ( cin word )
{
cout "Прочитано слово: " word "\n";
text.push_back(word);
}
// ...
}
Константа препроцессора может быть определена в командной строке при вызове компилятора с помощью опции -D (в различных реализациях эта опция может называться по-разному). Для UNIX-систем вызов компилятора с определением препроцессорной константы DEBUG выглядит следующим образом:
$ CC -DDEBUG main.C
Есть константы, которые автоматически определяются компилятором. Например, мы можем узнать, компилируем ли мы С++ или С программу. Для С++ программы автоматически определяется константа __cplusplus (два подчеркивания). Для стандартного С определяется __STDC__. Естественно, обе константы не могут быть определены одновременно. Пример: