Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие ОАиП.doc
Скачиваний:
11
Добавлен:
25.04.2019
Размер:
2.63 Mб
Скачать

Директивы препроцессора Директива #include

Директива препроцессора #include вставляет текст внешнего файла в текст программы, содержащей директиву. Директива имеет один из форматов:

#include <имя файла>

#include ”имя файла”

Файл, указываемый в директиве #include должен быть в формате ASCII. Угловые скобки указывают препроцессору искать включаемый файл в каталогах, определенных по умолчанию в IDE. Двойные кавычки указывают вначале производить поиск в текущем каталоге, а затем если файл не найден, в тех же каталогах, что и с угловыми скобками. Директива #include чаще всего используются для включения заголовочных файлов. Заголовочные файлы представляют собой библиотечные функции и имеют расширение h.

Директива #define

Директива предназначена для выполнения макроописаний и реализует функцию найти и заменить. Директива имеет следующий формат:

#define argument1 argument 2

где argument1 – идентификатор не содержащий пробелов, аrgument2 может содержать любые символы. Директива заменяет все вхождения argument1 в тексте программы на аrgument2.

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

Можно также определить макрос с параметрами. Например:

#define mac(a,b) argument1: a argument2: b

При использовании mac должно даваться две строки параметра. После

расширения mac() они заменяют a и b. Например:

expanded = mac(foo bar, yuk yuk)

после расширения даст

expanded = argument1: foo bar argument2: yuk yuk

Макросы обрабатывают строки и о синтаксисе C++ знают очень мало,

а о типах C++ или областях видимости - ничего. Компилятор видит

только расширенную форму макроса, поэтому ошибка в макросе

диагностируется когда макрос расширен, а не когда он определен. В

результате этого возникают непонятные сообщения об ошибках.

Вот такими макросы могут быть вполне:

#define Case break;case

#define nl <<"\n" #define forever for(;;) #define MIN(a,b) (((a)<(b))?(a):(b))

Вот совершенно ненужные макросы:

#define PI 3.141593

#define BEGIN {

#define END }

А вот примеры опасных макросов:

#define SQUARE(a) a*a

#define INCR_xx (xx)++

#define DISP = 4

Чтобы увидеть, чем они опасны, попробуйте провести расширения в следующем примере:

int xx = 0; // глобальный счетчик

void f()

{ int xx = 0; // локальная переменная

xx = SQUARE(xx+2); // xx = xx+2*xx+2

INCR_xx; // увеличивает локальный xx

if (a-DISP==b)

{ // a-= 4==b

}

}

Обратите внимание на различие результатов расширения этих двух макросов:

#define m1(a) something(a) // комментарий 1

#define m2(a) something(a) // комментарий 2

Например:

int a = m1(1)+2;

int b = m2(1)+2;

расширяется в

int a = something(1) // комментарий 1+2;

int b = something(1) // комментарий 2+2;

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

Операторы языка С(С++)

Все операторы языка С могут быть условно разделены на следующие категории:

- условные операторы, к которым относятся оператор условия if и оператор выбора switch;

- операторы цикла (for, while, do while);

- операторы перехода (break, continue, return, goto);

- другие операторы (оператор "выражение", пустой оператор).

Операторы в программе могут объединяться в составные операторы с помощью фигурных скобок. Любой оператор в программе может быть помечен меткой, состоящей из имени и следующего за ним двоеточия.

Все операторы языка С, кроме составных операторов, заканчиваются точкой с запятой ";".