
- •1.K&r c. Ansi c и iso c. Стандарт c99
- •Структура компилятора
- •3.Проблемы использования языка Си.
- •5.Числовые константы. Символические константы.
- •6.Идентификаторы. Константные переменные. Основные типы.
- •7.Указатели. Ссылки. Изменение типа данных.
- •8.Одномерные массивы. Символьные массивы.
- •9.Многомерные массивы.
- •10.Структуры.
- •11.Ключевое слово union.
- •12.Переименование типов (typedef).
- •13.Выражения.
- •14.Арифметические операции. Логические операции.
- •15.Операции присвоения.
- •16.Операции отношения. Адресные операции.
- •Адресные операции
- •17.Операции “?:”, sizeof, (тип)
- •18.Составной оператор. Оператор-выражение.
- •19.Условный оператор if. Оператор-переключатель switch. Условный оператор if
- •If (условие) оператор_1; else оператор_2;
- •If (условие) { оператор_1; оператор_2; … }
- •Оператор варианта switch
- •20.Операторы циклов while и do-while.
- •21.Оператор цикла for. Оператор продолжения continue.
- •22.Определение функции. Оператор возврата return. Вызов функции.
- •23.Функция main.
- •24.Поименованные константы и замена идентификаторов. Макросы.
- •If (выражение)
- •25.Включение файлов. Условная компиляция. Включение файла
- •26.Команда error. Команда pragma.
- •27.Обработка особых ситуаций. Обработка try, перехват catch, Спецификация особой ситуации throw.
- •28.Функции-подстановки (inline).
- •29.Операция создания объекта new. Операция delete. Операция new
- •Операция delete
- •30.Инкапсуляция. Наследование.
- •31.Полиморфизм.
- •32.Классы. Члены класса.
- •33.Конструктор. Деструктор. Функции-члены.
- •34.Операция доступа к области видимости “::”. Указатель this.
24.Поименованные константы и замена идентификаторов. Макросы.
Поименованные константы определяются с помощью директивы препроцессора define:
#define идентификатор строка-шаблон
Поименованные константы используются для того, чтобы облегчить чтение и изменение программ.
До и после идентификатора в директиве define должен быть один или более пробелов. Строка-шаблон начинается с первого отличного от пробела символа и заканчивается символом перевода строки. Строку-шаблон можно продолжить более чем на одну строку, начиная новые строки символом \.
После определения поименованной константы препроцессор заменяет в исходном тексте программы идентификатор значением строки-шаблона. Внутрикомментариев и строковых констант такая замена не производится.
В отличии от операторов языка Си, директивы препроцессора Си не заканчиваются символом ;.
Пример 1
#define TRUE 1
#define FALSE 0
#define MAXITEMS 500
int main()
{
int i, found, val[MAXITEMS];
found = FALSE ;
while (found == FALSE)
{
...
If (выражение)
found = TRUE;
}
...
for (i = 0; i < MAXITEMS; i++)
/* прочитать значение val [i] */
...
}
Использование в прим. 1 поименованных констант TRUE и FALSE делает текст программы более понятным. Константа MAXITEMS упрощает сопровождение программы. К примеру, если потребуется изменить количество предметов, придется исправить только одну директиву препроцессора и перекомпилировать программу.
При обработке препроцессором поименованные константы TRUE, FALSE и MAXITEMS заменяются, соответственно, на значения 0, 1 и 500 . При этом директивы препроцессора удаляются из исходного текста программы и не попадают на следующий этап компиляции.
Макросы - это препроцессорные "функции" , т.е. лексемы, созданные с помощью директивы #define, которые принимают параметры подобно функциям. После директивы #define указывается имя макроса, за которым в скобках (без пробелов) параметры, отделенные запятыми и определение макроса, отделенное пробелом.
Например:
#define ADD(x,y) x = x + y
если после этого написать:
int a=2;
int b=3;
ADD(a,b);
cout
то получим:
a=5 b=3
25.Включение файлов. Условная компиляция. Включение файла
Включение файлов (помимо других полезных вещей) позволяет легко управлять наборами директив #define и объявлений. Любая строка вида
#include "имя-файла"
или
#include <имя-файла>
заменяется содержимым файла с именем имя-файла. Если имя файла заключено в двойные кавычки, то, как правило, файл ищется среди исходных файлов программы; если такового не оказалось или имя файла заключено в угловые скобки < и >, то поиск осуществляется по определяемым реализацией правилам. Включаемый файл сам может содержать в себе строки #include.
Часто исходные файлы начинаются с нескольких строк #include, ссылающихся на файлы, содержащие общие директивы #define, объявления extern или прототипы нужных библиотечных функций из заголовочных файлов вроде <stdio.h>. (Строго говоря, эти включения не обязательно являются файлами; технические детали того, как осуществляется доступ к заголовкам, зависят от конкретной реализации.)
Директва #include — хороший способ собрать вместе объявления большой программы. Он гарантирует, что все исходные файлы будут пользоваться одними и теми же определениями и объявлениями переменных, благодаря чему предотвращаются особенно неприятные ошибки. Естественно, при внесении изменений во включаемый файл все зависимые от него файлы должны перекомпилироваться.
Работой препроцессора можно управлять с помощью условных инструкций. Они представляют собой средство для выборочного включения того или иного текста программы в зависимости от значения условия, вычисляемого во время компиляции.
Вычисляется константное целое выражение, заданное в строке #if. Это выражение не должно содержать операторы sizeof, приведения типов и констант из перечислений enum. Если оно имеет ненулевое значение, то будут включены все последующие строки вплоть до ближайшей директивы #endif, #elif, или #else. (Директива препроцессора #elif действует какelse if.) Выражение defined(имя) в #if равно 1, если имя было определено, и 0 в противном случае.
Например, чтобы застраховаться от повторного включения заголовочного файла hdr.h, его можно оформить следующим образом:
#if !defined(HDR)
#define HDR
/* здесь содержимое hdr.h */
#endif
При первом включении файла hdr.h будет определено имя HDR, а при последующих включениях препроцессор обнаружит, что имя HDR уже определено, и перескочит сразу на #endif. Этот прием может оказаться полезным, когда нужно избежать многократного включения одного и того же файла. Если им пользоваться систематически, то в результате каждый заголовочный файл будет сам включать заголовочные файлы, от которых он зависит, освободив от этого занятия пользователя.