Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015

Тут можно читать онлайн Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - бесплатно полную версию книги (целиком) без сокращений. Жанр: Прочая старинная литература, издательство Вильямс, год 0101. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - описание и краткое содержание, автор Стивен Прата, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать книгу онлайн бесплатно, автор Стивен Прата
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

#define XNAME(n) х ## n Тогда макрос XNAME(4)

будет расширен следующим образом: х4

В листинге 16.4 этот и еще один макрос применяются для слияния лексем с помощью операции ##.

Листинг 16.4. Программа glue.с

Ниже показан вывод х 1 14 х2 20 хЗ 30 Обратите внимание что в макросе - фото 493

Ниже показан вывод:

х 1 = 14 х2 = 20 хЗ = 30

Обратите внимание, что в макросе PRINT_XN() операция # используется для объединения строк, а операция ## — для объединения лексем в новый идентификатор.

672 глава 16

Макросы с переменным числом аргументов:

... И ___VA_ARGS_______

Некоторые функции, скажем, printf(), принимают переменное количество аргументов. Обсуждаемый ранее заголовочный файл stdvar.h предоставляет инструменты для создания определяемых пользователем функций с переменным числом аргументов. В С99/С11 то же самое сделано и для макросов.

Идея заключается в том, что последний аргумент в списке аргументов для определения макроса может быть троеточием. Если это так, то в заменяющей части может применяться предопределенный макрос VA_ARGS , который будет подставлен

вместо троеточия. Для примера рассмотрим следующее определение:

#define PR(...) printf(___VA_ARGS___)

Предположим, что в программе содержатся вызовы макроса вроде показанных ниже:

PR("Здравствуйте");

PR("вес = %d, доставка = $%.2f\n", wt, sp);

Для первого вызова __VA_ARGS__ расширяется в один аргумент:

"Здравствуйте"

Для второго вызова он расширяется в три аргумента:

"вес = %d, доставка = $%.2f\n", wt, sp

Таким образом, результирующий код выглядит так:

printf("Здравствуйте" );

printf("вес = %d, доставка = $%.2f\n", wt, sp);

В листинге 16.5 приведен более сложный пример, в котором используются конкатенация строк и операция #.

Листинг 16.5. Программа variadic.c

В первом вызове макроса X имеет значение 1 так что Х становится 1 В - фото 494

В первом вызове макроса X имеет значение 1, так что #Х становится "1". В результате получается следующее расширение:

print("Сообщение " "1" ": " "х = %g\n", х);

Затем осуществляется конкатенация четырех строк, сокращая вызов к такому виду:

print("Сообщение 1: х = %g\n", х);

Препроцессор и библиотека С 673

В итоге имеем показанный ниже вывод:

Сообщение 1: х = 48

Сообщение 2: х = 48.00, у = 6.9282

Не забывайте, что троеточие должно быть последним аргументом макроса; следующее определение является ошибочным:

#define WRONG (X, Y) #Х # VA_ARGS #у // не работает

Выбор между макросом и функцией

Многие задачи могут быть решены за счет применения макроса с аргументами либо функции. Что должно использоваться? Здесь нет каких-то строго определенных правил, но есть ряд соображений, которые следует принимать во внимание.

Макросы несколько сложнее в применении, чем обычные функции, т.к. макросы могут иметь неожиданные побочные эффекты, если вы проявите неосмотрительность. Некоторые компиляторы ограничивают определение макроса одной строкой, и вероятно лучше придерживаться этого ограничения, даже если в вашем компиляторе оно отсутствует.

Выбор между макросом и функцией связан с достижением компромисса между быстродействием и размером кода. Макрос генерирует встраиваемый код, т.е. в программу помещается оператор. Если макрос используется 20 раз, в программу вставляется 20 строк кода. Когда 20 раз применяется функция, в программе все равно содержится только одна копия ее операторов, что уменьшает размер кода. С другой стороны, поток управления программы должен переходить туда, где находится функция, и затем возвращаться в место ее вызова. Этот процесс отнимает больше времени, чем выполнение встраиваемого кода.

Преимущество макросов в том, что они не заботятся о типах переменных. (Причина связана с тем, что они имеют дело со строками символов, а не действительными значениями.) Таким образом, макрос SQUARE (х) может с одинаковым успехом использоваться с типом int или float.

В С99 появилась третья альтернатива — встраиваемые функции. Мы обсудим их позже в этой главе. Программисты обычно применяют макросы для простых функций, таких как перечисленные ниже:

#define MAX(X,Y) ((X) > (Y) ? (X) : (Y) )

#define ABS(X) ( (X) < 0 ? -(X) : (X))

#define ISSIGN(X) ((X) == ' + ' || (X) == '-' ? 1 : 0)

(Последний макрос имеет значение 1, или истинное, если х является символом алгебраического знака.)

Далее указано несколько моментов, о которых не следует забывать.

• Помните, что имя макроса не должно содержать пробелов, но пробелы допускаются в замещающей строке. В ANSI С разрешены пробелы в списке аргументов.

• Заключайте в скобки каждый аргумент и определение в целом. Это гарантирует корректное группирование элементов в выражении следующего рода:

forks = 2 * MAXtguests + 3, last);

• Используйте прописные буквы для имен функциональных макросов. Данное соглашение не так широко распространено, как применение прописных букв в именах константных макросов. Тем не менее, одна из веских причин использования прописных букв связана с тем, что это напоминает вам о возможных побочных эффектах макросов.

глава 16

картинка 495• Если вы намерены применять макрос вместо функции главным образом для ускорения работы программы, сначала попытайтесь выяснить, обеспечит ли это заметный выигрыш. Макрос, который используется в программе один раз, не приведет к значительному улучшению скорости ее выполнения. Макрос, находящийся внутри вложенного цикла, является намного лучшим кандидатом для ускорения работы программы. Многие системы предлагают профилировщики программ, которые помогают выявлять фрагменты кода, требующие наибольшего времени выполнения.

Предположим, что вы разработали несколько нужных вам функциональных макросов. Должны ли вы набирать их каждый раз, когда пишется новая программа? Нет, если вы будете помнить о директиве # include, которая рассматривается в следующем разделе.

Включение файлов: директива #±nciude

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

#include <-- Имя файла указано в угловых скобках

#include "mystuff.h" <���— Имя файла указано в двойных кавычках

В системе Unix угловые скобки сообщают препроцессору о необходимости поиска файла в одном или большем числе стандартных системных каталогов. Двойные кавычки говорят о том, что сначала следует просмотреть текущий каталог (или другой каталог, который указан вместе с именем файла), а затем искать в стандартных каталогах:

#include <���— Поиск в системных каталогах

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стивен Прата читать все книги автора по порядку

Стивен Прата - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Язык программирования C. Лекции и упражнения (6-е изд.) 2015 отзывы


Отзывы читателей о книге Язык программирования C. Лекции и упражнения (6-е изд.) 2015, автор: Стивен Прата. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x