Урок 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] |
Очевидно, что второе описание более наглядно, чем первое.
Оставить комментарий