Cтраница 3
Макросы препроцессора представляют собой операции, определяемые в директиве препроцессора define. Макрос состоит из имени ( идентификатора макроса) и текста замены. Макросы могут определяться со списком параметров или без него. Макросы без параметров обрабатываются подобно символическим константам - текст замены подставляется в программе вместо идентификатора макроса. Макросы с параметрами подставляют параметры в заменяющий текст, и затем происходит расширение макроопределения в программе. [31]
Символические константы и макросы могут быть аннулированы с помощью директивы препроцессора undef. Директива undef отменяет определение символической константы или макроса. [32]
Определения символических констант и макросов могут быть аннулированы при помощи директивы препроцессора undef. Директива undef отменяет определение символической константы или макроса. Область действия символической константы или макроса начинается с места их определения и заканчивается явным, их аннулированием директивой undef или концом файла. [33]
Константные переменные используются так же, как символические константы, определяемые директивой препроцессора Idef ine и традиционно применяемые в программах на языке С. Там, где требуется константное выражение, нужно инициализировать константную переменную константным выражением. Подобно константе, определяемой оператором ttdefine, константная переменная может быть определена в файле заголовков, включенном в один или более исходных файлов, составляющих программу. В отличие от неконстантной переменной, константная по умолчанию является локальной для файла, в котором она определена. Иногда она может быть определена более чем в одном исходном файле, что не приводит к появлению ошибки при компоновке программы. [34]
Препроцессинг - необязательная фаза, состоящая в анализе исходного текста, извлечения из него директив препроцессора и их выполнения. [35]
В качестве примера использования прототипов функции для расширения области действия функции, рассмотрим любую программу, содержащую директиву препроцессора include string. Эта директива включает в файл прототипы функций типа strcmp и strcat. Все функции в файле могут использовать функции strcmp и strcat для выполнения своих задач. Функции strcmp и strcat определены где-то в другом месте и нам не нужно знать, где они определены; мы просто можем использовать их в наших программах. Редактор связей разрешит ссылки на эти функции автоматически. [36]
Обработка программы препроцессором происходит перед ее компиляцией. Все директивы препроцессора начинаются с символа и до начала директивы в строке могут находиться только символы пробела. [37]
Условные директивы препроцессора вычисляют значение целочисленного выражения. В директивах препроцессора не допускаются выражения приведения типа, выражения sizeof и перечислимые константы. [38]
Не забывайте, что директивы препроцессора не являются операторами языка С. [39]
Из промежуточного файла все директивы препроцессора удаляются, поэтому они отсутствуют в конечном варианте кода источника. [40]
Если в дальнейшем заменить задаваемое значение Debug на false, то операторы отладки перестанут выполняться. Отличие этого подхода от использования директив препроцессора заключается в том, что коды операторов отладки в этом случае останутся в тексте программы, увеличивая размер выполняемого модуля. А директивы условной компиляции просто уберут отладочный код из программы. [41]
Компилятор читает не исходный файл источника, а результат работы препроцессора и компилирует его в исполняемый файл программы. Вам уже приходилось встречаться с директивой препроцессора include: она предписывает найти файл, имя которого следует за ней, и вставить текст этого файла по месту вызова. Этот эффект подобен следующему: вы полностью вводите данный файл прямо в свою исходную программу, причем к тому времени, когда компилятор получит исходный код, файл будет уже на месте. [42]
Условные директивы препроцессора вычисляют значения целочисленных константных выражений. Операции преобразования типов, операция sizeof и константы перечислимого типа не могут участвовать в выражениях, вычисляемых в директивах препроцессора. [43]
Эта глава - введение в препроцессор С, выполняющий, как это следует из его названия, обработку программы до ее компиляции. Вот некоторые из возможных действий препроцессора: включение других файлов в файл, который будет компилироваться, определение символических констант и макросов, условная компиляция кода программы и условное выполнение директив препроцессора. Все директивы препроцессора начинаются с, и только пробельные символы могут стоять в строке перед этими директивами. [44]
Эта глава - введение в препроцессор С, выполняющий, как это следует из его названия, обработку программы до ее компиляции. Вот некоторые из возможных действий препроцессора: включение других файлов в файл, который будет компилироваться, определение символических констант и макросов, условная компиляция кода программы и условное выполнение директив препроцессора. Все директивы препроцессора начинаются с, и только пробельные символы могут стоять в строке перед этими директивами. [45]