моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Язык C устанавливает некоторые предопределенные символы, которые можно использовать напрямую и обрабатывать во время предварительной обработки.
__FILE__//进行编译的源文件
__LINE__//文件当前的行号
__DATE__//文件被编译的日期
__TIME__//文件被编译的时间
__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义
Результаты теста:
#define используется для записи определения при определении константы:
#define MAX 100
Логическим правилом является прямая замена MAX на 100 при появлении в следующем коде. Этот этап операции выполняется на этапе предварительной обработки. Обычно при использовании #define для определения константы имя записывается в верхнем регистре.
сцены, которые будут использоваться:
#define используется для определения макросов так же, как и функции, но логика заключается в замене. При замене переменные должны быть заключены в круглые скобки, чтобы избежать проблем с приоритетом оператора, которые могут привести к неожиданным результатам.
Как использовать:
#define MAX(x,y) ((x) > (y) ? (x) : (y))
Это макрос, написанный для завершения оценки непосредственно большего значения двух чисел. Обратите внимание, что скобки после имени макроса должны быть близки к макросу.
Вариант использования:
В двух приведенных выше случаях мы можем обнаружить, что макросы не ограничивают тип при передаче параметров. Если функция передается, тип возвращаемого значения функции фиксируется, и макрос выполняется быстрее.
Плюсы макросов:
- 1. При выполнении расчетов с небольшим объемом кода время работы макросов короче, чем у функций.
- 2. Что еще более важно, параметры функции должны быть объявлены с определенными типами. Макросы можно применять к различным типам, которые можно сравнивать с помощью >. Тип макроса не имеет значения.
Недостатки макросов:
- Каждый раз при использовании макроса копия кода определения макроса будет вставлена в программу. Если макрос не относительно короткий, это может значительно увеличить длину программы.
- Макросы не могут быть отлажены.
- Поскольку макросы не зависят от типа, они недостаточно строги.
- Макросы могут вызывать проблемы с приоритетом операторов, что делает программы склонными к ошибкам.
Сравнительная таблица макросов и функций:
Атрибуты | #define определенные макросы | функция |
---|---|---|
длина кода | Макрос вставляется в программу каждый раз при ее использовании.За исключением очень маленьких макросов, длина программы значительно увеличится. | Код функции появляется только в одном месте; каждый раз, когда он используется, в этом месте вызывается один и тот же код. |
Скорость выполнения | Быстрее | Существуют дополнительные накладные расходы на вызовы и возвраты функций, что медленнее. |
приоритет оператора | Параметры макроса оцениваются в контексте всех окружающих выражений. Если не включены круглые скобки, приоритет соседних операторов может иметь непредсказуемые последствия, поэтому рекомендуется писать макросы с большим количеством скобок. | Параметры функции оцениваются и передаются функции только при ее вызове. Выражения оцениваются предсказуемо. |
Параметры с побочными эффектами | Параметры могут быть заменены в нескольких местах тела макроса, и если параметры макроса оцениваются несколько раз, оценка параметров с побочными эффектами может привести к непредсказуемым результатам. | Параметры функции оцениваются только при передаче параметров и ими легко управлять. |
Тип параметра | Параметры макроса не имеют ничего общего с типом. Пока операция над параметрами разрешена, ее можно использовать для любого типа параметра. | Параметры функции связаны с типом. Если они разные, то нужны разные функции и задачи разные. |
отлаживать | Макросы неудобно отлаживать | Функции можно отлаживать оператор за оператором. |
рекурсия | Макросы не могут быть рекурсивными | Макросы не могут быть рекурсивными |
Оператор # преобразует аргумент макроса в строковый литерал. Разрешено появление только в списке подстановок макроса с параметрами.
Операцию, выполняемую оператором #, можно понимать как «стрингификацию».
Пример использования:
## может объединять символы с обеих сторон в один символ, что позволяет определениям макросов создавать идентификаторы из отдельных текстовых сегментов.клей для маркеров
Такое соединение должно создавать действительный идентификатор. В противном случае результат не определен. Давайте подумаем об этом. При написании функции для поиска большего значения двух чисел необходимо писать разные функции для разных типов данных.
Пример использования: