Поделиться через


Рекомендации по выбору между функциями и макросами

Большинство подпрограмм библиотеки времени выполнения Microsoft — это скомпилированные или собранные функции, но некоторые подпрограммы реализованы в виде макросов. Если в файле заголовка для подпрограммы объявляется и функция, и макрос, определение макроса имеет приоритет, поскольку оно всегда находится после объявления функций. При вызове подпрограммы, которая реализована и как функция, и как макрос, можно заставить компилятор использовать функцию двумя способами:

  • Заключить имя подпрограммы в скобки.

    #include <ctype.h>
    a = _toupper(a);    // Use macro version of toupper.
    a = (_toupper)(a);  // Force compiler to use
                        // function version of toupper.
    
  • Отменить определение макроса с помощью директивы #undef:

    #include <ctype.h>
    #undef _toupper
    

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

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

  • Функция оценки функции вычисляет адрес; макрос не выполняется. Таким образом, нельзя использовать имя макроса в контекстах, требующих указателя. Например, можно объявить указатель на функцию, но не указатель на макрос.

  • Проверка типов. При объявлении функции компилятор может проверить типы аргументов. Так как невозможно объявить макрос, компилятор не может проверять типы аргументов макросов; Хотя он может проверить количество аргументов, которые вы передаете макрос.

См. также

Математика с универсальным типом
Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib