Обмен технологиями

Предварительная обработка «Языка C»

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Предопределенные символы

Язык C устанавливает некоторые предопределенные символы, которые можно использовать напрямую и обрабатывать во время предварительной обработки.

__FILE__//进行编译的源文件
__LINE__//文件当前的行号
__DATE__//文件被编译的日期
__TIME__//文件被编译的时间
__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义
  • 1
  • 2
  • 3
  • 4
  • 5

Результаты теста:
Вставьте сюда описание изображения

2. #define определяет константы

#define используется для записи определения при определении константы:

#define MAX 100
  • 1

Логическим правилом является прямая замена MAX на 100 при появлении в следующем коде. Этот этап операции выполняется на этапе предварительной обработки. Обычно при использовании #define для определения константы имя записывается в верхнем регистре.

сцены, которые будут использоваться:
Вставьте сюда описание изображения

3. #define определяет макросы

#define используется для определения макросов так же, как и функции, но логика заключается в замене. При замене переменные должны быть заключены в круглые скобки, чтобы избежать проблем с приоритетом оператора, которые могут привести к неожиданным результатам.
Как использовать:

#define MAX(x,y) ((x) > (y) ? (x) : (y))
  • 1

Это макрос, написанный для завершения оценки непосредственно большего значения двух чисел. Обратите внимание, что скобки после имени макроса должны быть близки к макросу.

Вариант использования:
Вставьте сюда описание изображения
Вставьте сюда описание изображения

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

4. Сравнение функций обновления макросов

Плюсы макросов:

  • 1. При выполнении расчетов с небольшим объемом кода время работы макросов короче, чем у функций.
  • 2. Что еще более важно, параметры функции должны быть объявлены с определенными типами. Макросы можно применять к различным типам, которые можно сравнивать с помощью >. Тип макроса не имеет значения.

Недостатки макросов:

    1. Каждый раз при использовании макроса копия кода определения макроса будет вставлена ​​в программу. Если макрос не относительно короткий, это может значительно увеличить длину программы.
    1. Макросы не могут быть отлажены.
    1. Поскольку макросы не зависят от типа, они недостаточно строги.
    1. Макросы могут вызывать проблемы с приоритетом операторов, что делает программы склонными к ошибкам.

Сравнительная таблица макросов и функций:

Атрибуты#define определенные макросыфункция
длина кода Макрос вставляется в программу каждый раз при ее использовании.За исключением очень маленьких макросов, длина программы значительно увеличится.Код функции появляется только в одном месте; каждый раз, когда он используется, в этом месте вызывается один и тот же код.
Скорость выполненияБыстрееСуществуют дополнительные накладные расходы на вызовы и возвраты функций, что медленнее.
приоритет оператораПараметры макроса оцениваются в контексте всех окружающих выражений. Если не включены круглые скобки, приоритет соседних операторов может иметь непредсказуемые последствия, поэтому рекомендуется писать макросы с большим количеством скобок. Параметры функции оцениваются и передаются функции только при ее вызове. Выражения оцениваются предсказуемо.
Параметры с побочными эффектамиПараметры могут быть заменены в нескольких местах тела макроса, и если параметры макроса оцениваются несколько раз, оценка параметров с побочными эффектами может привести к непредсказуемым результатам.Параметры функции оцениваются только при передаче параметров и ими легко управлять.
Тип параметраПараметры макроса не имеют ничего общего с типом. Пока операция над параметрами разрешена, ее можно использовать для любого типа параметра.Параметры функции связаны с типом. Если они разные, то нужны разные функции и задачи разные.
отлаживатьМакросы неудобно отлаживатьФункции можно отлаживать оператор за оператором.
рекурсияМакросы не могут быть рекурсивнымиМакросы не могут быть рекурсивными

5. # и ##

1. #оператор

Оператор # преобразует аргумент макроса в строковый литерал. Разрешено появление только в списке подстановок макроса с параметрами.
Операцию, выполняемую оператором #, можно понимать как «стрингификацию».

Пример использования:
Вставьте сюда описание изображения

2. Оператор ##

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

Пример использования:
Вставьте сюда описание изображения