Урок 12.1. Определение символических констант

12.1. Определение символических
констант

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

#define <идентификатор> <строка подстановки>

 

Здесь <идентификатор> – любое имя, записанное в соответствии с правилами языка Си. <строка подстановки> – строка, на которую замещается любое вхождение <идентификатора>. Единственное исключение, это когда <идентификатор> встречается в строке, заключенной в кавычки. В этом случае <идентификатор> считается частью символьной строки и подстановка не производится. Определения, даваемые директивой #define, имеют силу от места, где встретилась эта директива, до конца файла.

Пример:

#define STRING1 "Это строка номер один"
main ()
{
  printf ("STRING1: %s\n",STRING1);
}

В результате работы этой программы будет напечатано:

STRING1: Это строка номер один

Как видим, в первом случае STRING1 не было замещено. И произошло это потому, что STRING1 "защищено" кавычками. <Строка подстановки> должна уместиться физически в одной строке. В противном случае ее можно перенести на следующую строку с помощью символа \.

Например, записи

#define STRING1 "Это строка \
номер один"
и
#define STRING1 "Это строка номер один"

совершенно идентичны.

После того, как произведена подстановка, результирующая строка снова просматривается и если в ней есть имена, определенные с помощью директивы #define, они замещаются соответствующими подстановками.

Например, в следующем фрагменте:

#define ADDRESS BASE+OFFSET+INDEX
#define BASE 534
#define OFFSET 612
#define INDEX 163
. . .
x=ADDRESS;

после обработки строки x=ADDRESS; препроцессором, она превращается в x=BASE+OFFSET+INDEX; , которая в свою очередь после обработки препроцессором превращается в x=534+612+163; и в таком виде передается компилятору, а сложение производится уже при выполнении программы.

Если с помощью директивы #define определено имя, ранее уже определенное с помощью другой директивы #define, препроцессор выдает предупреждение о переопределении константы, но продолжает работать. Использование символических констант чрезвычайно полезно, так как программы становятся более мобильными, переносимыми. Кроме того, смысл таких констант яснее и программы легче модифицировать.

Например:

int table[100]; /* количество элементов в таблице */
 
#define NUM_ELEM 100
int table[NUM_ELEM]

Очевидно, что второе описание более наглядно, чем первое.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов