📜  C++中预处理器指令和函数模板的区别

📅  最后修改于: 2021-09-11 04:03:10             🧑  作者: Mango

预处理器指令是在编译之前处理我们的源代码的程序。在用 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 等的准备工作,请参阅完整的面试准备课程