Разница между директивами препроцессора и шаблонами функций в C ++
Директивы препроцессора - это программы, которые обрабатывают наш исходный код перед компиляцией. Между написанием программы и ее выполнением на 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 У них есть явная полная специализация У них нет явной полной специализации