预处理器指令是在编译之前处理我们的源代码的程序。在用 C/C++ 编写程序和执行程序之间涉及许多步骤。
下面是说明函数模板功能的程序:
C++
// C++ program to illustrate
// preprocessor directives
#include
#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;
}
C++
// C++ program to illustrate the use
// of Function Templates
#include
#include
using namespace std;
// Function Template
template
T Min(T x, T y)
{
return (x < y) ? x : y;
}
// Driver Code
int main()
{
int a = 4, b = 8;
// Find the minimum of a and b
cout << "Minimum of both is: " << min(a, b);
return 0;
}
输出:
Minimum of both is: 2
函数模板是可以处理不同数据类型而无需任何单独代码的通用函数。
下面是说明函数模板功能的程序:
C++
// C++ program to illustrate the use
// of Function Templates
#include
#include
using namespace std;
// Function Template
template
T Min(T x, T y)
{
return (x < y) ? x : y;
}
// Driver Code
int main()
{
int a = 4, b = 8;
// Find the minimum of a and b
cout << "Minimum of both is: " << min(a, b);
return 0;
}
输出:
Minimum of both is: 4
函数模板用于创建可以处理任何数据类型的通用函数。例如,用于计算任何类型的 2 个值的最小值的函数模板可以定义为:
template
T minimum(T a, T b)
{
return (a < b) ? a : b;
}
但是,也可以使用使用预处理器指令#define创建的预处理器指令来执行此任务。因此,这两个数中的最小值可以定义为:
#define minimum(a, b) ((a < b) ? a : b)
预处理器指令也可以通过使用以下语句来实现:
minimum(30, 35);
minimum(30.5, 40.5);
在 C++ 中,我们大多数人更喜欢使用模板而不是预处理器指令,因为:
- 对于预处理器指令,没有类型检查。但是在模板的情况下,完整的类型检查是由编译器完成的。
- 预处理器指令可以调用意外结果。考虑一个计算任意数平方的宏:
#define sqr(x) (x*x)
- 现在,如果使用以下语句调用此宏,则 x = sqr(4 + 4);那么预期输出是 64 但它生成 24 因为宏体中的任何 x 被 4 + 4 替换,这导致 x = 4 + 4 * 4 + 4 = 24 但在模板的情况下,不会获得这种意外结果。
以下是两者之间的表格差异:
S. No. | Pre-processor directives | Function Templates |
1 | There is no type checking | There is full type checking |
2 | They are preprocessed | They are compiled |
3 | They can work with any data type | They are used with #define preprocessor directives |
4 | They can cause an unexpected result | No such unexpected results are obtained. |
5 | They don’t ensure type safety in instance | They do ensure type safety |
6 | They have explicit full specialization | They don’t have explicit full specialization |
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程。