Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

  if (fi == 0) error("невозможно открыть файл для ввода");

  if (fo == 0) error("невозможно открыть файл для вывода");

  /* чтение из файла с помощью функций ввода из библиотеки stdio,

     например, getc */

  /* запись в файл с помощью функций вывода из библиотеки stdio,

     например, fprintf */

  fclose(fo);

  fclose(fi);

}

Учтите: в языке С нет исключений, потому вы не можете узнать, что при обнаружении ошибок файлы были закрыты.

<p id="AutBody_Root560"><strong>27.7. Константы и макросы</strong></p>

В языке С константы не являются статическими.

const int max = 30;

const int x; /* неинициализированная константа: OK в C

                (ошибка в C++) */

void f(int v)

{

  int a1[max]; /* ошибка: граница массива не является константой

                  (OK в языке C++) */

               /* (слово max не допускается в константном

                  выражении!) */

  int a2[x];   /* ошибка: граница массива не является константой */

  switch (v) {

  case 1:

    /* ... */

    break;

  case max:    /* ошибка: метка раздела case не является

                  константой (OK в языке C++) */

    /* ... */

    break;

  }

}

По техническим причинам в языке С (но не в языке C++) неявно допускается, чтобы константы появлялись из других модулей компиляции.

/* файл x.c: */

const int x;     /* инициализирована в другом месте */

/* файл xx.c: */

const int x = 7; /* настоящее определение */

В языке С++ в разных файлах могут существовать два разных объекта с одним и тем же именем x. Вместо использования ключевого слова const для представления символьных констант программисты на языке С обычно используют макросы. Рассмотрим пример.

#define MAX 30

void f(int v)

{

  int a1[MAX]; /* OK */

  switch (v) {

  case 1:

    /* ... */

    break;

  case MAX:    /* OK */

    /* ... */

    break;

  }

}

  Имя макроса MAX заменяется символами 30, представляющими собой значение этого макроса; иначе говоря, количество элементов массива a1 равно 30, а меткой второго раздела case является число 30. По общепринятому соглашению имя макроса MAX состоит только из прописных букв. Это позволяет минимизировать ошибки, вызываемые макросами.

<p id="AutBody_Root561"><strong>27.8. Макросы</strong></p>

  Берегитесь макросов: в языке С нет по-настоящему эффективных способов избежать макросов, но их использование имеет серьезные побочные эффекты, поскольку они не подчиняются обычным правилам разрешения области видимости и типов, принятым в языках С и С++. Макросы — это вид текстуальной подстановки. См. также раздел А.17.2.

  Как защититься от потенциальных проблем, связанных с макросами, не отказываясь от них навсегда (и не прибегая к альтернативам, предусмотренным в языке С++?

• Присваивайте всем макросам имена, состоящие только из прописных букв: ALL_CAPS.

• Не присваивайте имена, состоящие только из прописных букв, объектам, которые не являются макросами.

• Никогда не давайте макросам короткие или “изящные” имена, такие как max или min.

• Надейтесь, что остальные программисты следуют этим простым и общеизвестным правилам.

В основном макросы применяются в следующих случаях:

• определение “констант”;

• определение конструкций, напоминающих функции;

• улучшение синтаксиса;

• управление условной компиляцией.

Кроме того, существует большое количество менее известных ситуаций, в которых могут использоваться макросы.

Мы считаем, что макросы используются слишком часто, но в программах на языке С у них нет разумных и полноценных альтернатив. Их даже трудно избежать в программах на языке С++ (особенно, если вам необходимо написать программу, которая должна подходить для очень старых компиляторов или выполняться на платформах с необычными ограничениями).

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

<p id="AutBody_Root562"><strong>27.8.1. Макросы, похожие на функции</strong></p>

Рассмотрим типичный макрос, напоминающий функцию.

#define MAX(x, y) ((x)>=(y)?(x):(y))

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT