Программирование на языке си ( с ) | C Sharp (Си шарп) с нуля. Сортировки | Массивы | Функции

Директивы препроцессора в языке си — include | define

   include

Директива препроцессора include у нас находится буквально в каждом примере. Она создает копию файла, который мы в ней указываем, и добавляет его в нашу программу. Есть два варианта включения директивы include:

  1. #include <имя файла>
  2. Поиск этого файла будет вестись в каталоге, где расположены библиотечные файлы.

  3. #include "имя файла"
  4. Поиск будет осуществляться в каталоге, где расположена наша программа.

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

    define

Директива препроцессора define используется, что бы создать константы. Вот ее синтаксис:

#define идентификатор    значение

Теперь давайте разберем принцип работы define. Перед компиляцией программы, во всех местах, где используется наш идентификатор, будет произведена замена его на значение, которое мы указали там же. Вот пример говорящий о его полезности:

#define SIZE 5
for (int i=0; i < SIZE; i++){
     for (int j=0; j < SIZE;j++){
         printf("*");
     }
     printf("\n");
}

Эта программа будет выводить квадрат размеров SIZExSIZE. Она хороша тем, что если нам понадобится изменить размеры нашего квадрата, то достаточно будет только изменить значение нашей заданной константы SIZE на необходимое.

Часто совершается одна очень грубая ошибка: во время написания значения для заданной константы ставят знак присвоения (=):

#define SIZE = 6

Это в корне неверно и компилятор выдаст вам ошибку, так как он заменит все константы SIZE на = 6. Т.е. вставит во все места не только цифру 6 но и еще знак присвоения.

Так же директиву препроцессора define можно использовать для задания макросов. Макросы, как и функции, могут задаваться без аргументов или с аргументами. Вот пример:

#define SIZE 5 // без аргументов - получается обычная константа
#define SIZE(x) (x * x) // с аргументами

Но тут есть свои подводные камни. Вот на примере:

SIZE (5); // будет 25
SIZE (1+4); // будет 9

На первый взгляд это покажется удивительно, так как мы передаем в принципе все туже пятерку. Но вот как препроцессор заменит макрос:

5*5 // в первом случае
1+4*1+4 // во втором

Для избегания такой проблемы нужно каждую константу, используемую в макросе брать в скобки. Вот правильное написание нашего макроса:

#define SIZE(x) ( (x) * (x) )

Тут уже никаких ошибок не возникнет, и наша программа заменит все верно. Первая часть о директивах препроцессора успешно подошла к концу, но эта тема еще не до конца рассказана, поэтому ждите продолжения...

Рекомендации:

  1. Генератор случайных чисел
  2. Указатели и адресса ссылки в языке си
  3. Булева алгебра логики — таблица истинности ( конъюнкция ) и логические операции
При копировании ( использовании ) материала размещайте ссылку на сайт www.mir-koda.ru