Разница между директивами препроцессора и шаблонами функций в C ++

Опубликовано: 16 Декабря, 2021

Директивы препроцессора - это программы, которые обрабатывают наш исходный код перед компиляцией. Между написанием программы и ее выполнением на C / C ++ проходит несколько этапов.

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

C ++

// C++ program to illustrate
// preprocessor directives
#include <bits/stdc++.h>
#define min(a, b) ((a < b) ? a : b)
using namespace std;
// Driver code
int main()
{
int a = 2, b = 4;
// Find the minimum of a and b
cout << "Minimum of both is: "
<< min(a, b);
return 0;
}
Выход:
Минимум обоих: 2

Шаблоны функций - это универсальная функция, которая может обрабатывать разные типы данных без необходимости в каком-либо отдельном коде.

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

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

 шаблон <класс T>
T минимум (T a, T b)
{
   return (a <b)? а: б;
}

Но эту задачу также можно выполнить с помощью директив препроцессора, созданных с помощью директивы препроцессора #define. Итак, минимум из двух чисел можно определить как:

 #define minimum (a, b) ((a <b)? a: b)

Директивы препроцессора также могут быть достигнуты с помощью следующих операторов:

 минимум (30, 35);
минимум (30,5, 40,5);

В C ++ большинство из нас предпочитает использование шаблонов директивам препроцессора, потому что:

  • В случае директив препроцессора проверка типов отсутствует. Но в случае с шаблонами полная проверка типов выполняется компилятором.
  • Директивы препроцессора могут вызвать неожиданный результат. Рассмотрим макрос, который вычисляет квадрат любого числа как:
 # определить sqr (x) (x * x)
  • Теперь, если этот макрос вызывается с помощью следующего оператора, x = sqr (4 + 4); тогда ожидаемый результат равен 64, но он генерирует 24, потому что любой x в теле макроса заменяется на 4 + 4, что приводит к x = 4 + 4 * 4 + 4 = 24, но в случае шаблонов такие неожиданные результаты не получаются.

Ниже представлена табличная разница между ними:

С. Нет. Директивы препроцессора Шаблоны функций
1 Нет проверки типа Есть полная проверка типа
2 Они предварительно обработаны Они составлены
3 Они могут работать с любым типом данных Они используются с директивами препроцессора #define
4 Они могут вызвать неожиданный результат Таких неожиданных результатов нет.
5 Например, они не обеспечивают безопасность типов. Они действительно обеспечивают безопасность типов
6 У них есть явная полная специализация У них нет явной полной специализации
Хотите узнать больше о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровней C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .