|
Программирование >> Структурное программирование
Рис. 17.1. Предопределенные символические константы Операция ## выполняет конкатенацию (сцепление, склеивание) двух лексем. Рассмотрим следующее макроопределение: tdefine TOKENCONCAT(х, у) х tt у Когда в программе встречается макрос TOKENCONCAT, его аргументы склеиваются и полученное выражение используется для замещения идентификатора макроса. Например, TOKENCONCAT (О, К) будет замещаться в тексте программы на ОК. Операция ## должна иметь два операнда. 17.8. Нумерация строк Директива препроцессора Mine задает целочисленное константное начальное значение номера строки для нумерации следующих за директивой строк исходного текста программы. Директива tline 100 задает начальное значение номера строки, равное 100, и все последующие строки исходного текста программы будут нумероваться, начиная с этого номера. В директиву #line может быть включено имя файла. Директива tline 100 filel.c изменит нумерацию последующих строк программы, которая начнется со значения 100, и компилятор во всех своих сообщениях будет ссылаться на файл с именем filel.c . Директива обычно используется для того, чтобы сделать сообщения о синтаксических ошибках и предупреждения компилятора более удобными для понимания. Номера строк не добавляются в исходный файл. 17.9. Предопределенные символические константы Имеются пять предопределенных символических констант (см. рис. 17.1). Идентификаторы каждой из предопределенных символических констант начинаются и заканчиваются двумя символами подчеркивания. Эти идентификаторы и идентификатор defined (описанный в разделе 17.5) не могут использоваться в директивах #define или #undef. 17.10. Макрос assert Макрос assert, ощ)рделснный в заголовочном файле <as! ert.b>, вьпгол-няет проверку значения выражения. Если значение вырансения О (ложь), то макрос assert выводит сообщение об ошибке и вызывает функцию abort (из библиотеки утилит общ(цю назначения <stdlib.h>), kotoiwh завершает выполнение программы. Этот макрос удобно использоватъ иртт отладке для проверки того, что переменная имеет правильное значение. Например, предположим, что переменная х в программе не дол.жЕта njniHTiMaTb значение большее, чем 10. В этом случае макрос assert можно исио.чьзоват(, для проверки значения х и вывода сообщения об ошиб1се, (>сm значение х вышло из допустимого диппаз1)11а. Оператор может выг.пядеть с.педующи.м г)бразом: assert (х <---- .10,1 ; Если при вьшо.чнепип этого оператора х будет иметь значение, большее, чем 10, то про-рамми выдаст сообщеште об ошибке, солеркащее номер строки и имя фай.ла, после че1 о .ianepinirr свою pa6ojy. Сеиерь jijw)i рпммист д.ия того, чтобы найти ошибку, mojct сконцентрировать свое апт1мппи< па об.тасти кода, выдавшей сообщение, [((сте того, как в тексте программ!.! обт,является символическая константа NI)r,BUG, зсе последующие вызовы макроса ;,.ssert будут игнохжроваться. Таким 1п>разом, когда все они будут бг),тьше иг. нужны (т.е. когда отладка закончеип). в нача,ле программы достаточно добавить гтроку #def.ine NDEBUG вместо того, чтобы удаля гь кажд.ытт матерое assert щл чпую. Резюме Все директивы пр(Ч1родессора нагичакггся с симво.ча В строке программ!,! перед директивой np(4]poTi,ef;c(ip.i могут находиться только символы пробела. Директива #include включает в текст программы когтю указанного файла. Ес.чи имя ф!1Й.ча заключено в кавычки, иреироцессор начинает поиск включаемого файла с того каталога, в котором находится ком пилируемый фай.ч. Если имя файла заг-сцючепо v ут.човые скобки (< и >), то последовачельность поиси:а npenpo!i,ercf.poM чадгшного фай.да в ката.догах определяется испо.лъзуемотт системой ттрограммттровапия. Директива препроцессора #define используется д.ля опред(?.чеппя символической константы или макроса. Символическая константа - это имя, присвоенное константе. Макрос - это некоторая операция, определенная директивот! препроцессора #define. Макросы могут иметь, или не иметь параметры. Замещающий текст макроса или символической константы - это весь текст, следуютщтй за идентификатором в строке Д!третстивы #define. Если текст для подстановки макроса илгт символической константы д.диннее, чем остаток строки, то в конце строки можно поставить символ обратного слэша (\), указывающий на то, что замещающий текст продолжается на следующей строке. Символические константы и макросы могут быть аннулированы с помощью директивы препроцессора #undef. Директива #undef отменяет определение символической константы или макроса. Область действия символической константы или макроса начинается с места их определения и заканчивается явным их аннулированием директивой #undef или концом файла. Условная компиляция дает возможность программисту управлять выполнением директив препроцессора и компиляцией программного кода. Условные директивы препроцессора вычисляют значения целочисленных константных выражений. Операции преобразования типов, операция sizeof и константы перечислимого типа не могут участвовать в выражениях, вычисляемых в директивах препроцессора. Каждая директива #if должна заканчиваться директивой #endif. Директивы #ifdef и #ifndef являются сокращением выражений #if de-iined{uMH) и #if !defined(u ). С помощью директив #elif (эквивалент else if в структуре if) и #else (эквивалент else в структуре if) можно создавать сложные конструкции условных директив препроцессора. Директива #еггог печатает сообщение об ошибке, зависящее от используемой системы и содержащее заданные в директиве лексемы, после чего завершает предварительную обработку и компиляцию. Директива #pragma вызывает действия, зависящие от используемой системы. Директива #pragma, не распознанная системой, игнорируется. Операция # преобразует подставляемую лексему в строку символов, взятую в кавычки. Операция # должна использоваться только в макросе с параметрами, потому что операция # применяется к параметру макроса. Операция ## выполняет конкатенацию (сцепление, склеивание) двух лексем. Операция ## должна иметь два операнда. Директива препроцессора #Нпе задает целочисленное константное начальное значение номера строки для нумерации следующих за директивой строк исходного текста программы. Имеется пять предопределенных символических констант. Константа LINE обозначает номер текущей строки исходного текста (целое число). Константа FILE - это предполагаемое имя файла (строка). Константа DATE обозначает дату компиляции исходного файла (строка). Константа TIME обозначает время компиляции исходного файл (строка). Константа STDC 1 предназначена для указания, что данная реализация удовлетворяет стандартам ANSI. Обратите внимание, что каждая из предопределенных символических констант начинается и заканчивается двумя символами подчеркивания. Макрос assert, определенный в заголовочном файле assert.h, проверяет значение выражения. Если значение выражения равно О (ложь), то макрос assert выводит сообщение об ошибке и вызывает функцию abort, завершающую выполнение программы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |