C语言的宏与C++里面的模板有什么区别

C语言的宏与C++里面的模板的区别:1、概念不同;2、语法不同;3、应用不同。概念不同是指C语言的宏定义是C语言本身的组成部分且不能直接对它们进行编译,而C++里面的模板允许程序员定义一种适用于不同类型的对象的行为。

一、C语言的宏与C++里面的模板的区别

1、概念不同

C语言的宏:C语言中的宏定义也叫做预处理命令,预处理命令是C语言本身的组成部分,不能直接对它们进行编译。

C++里的模板:C++里面的模板允许程序员定义一种适用于不同类型的对象的行为,模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

2、语法不同

C语言的宏:在 C 语言中,可以采用命令 #define 来定义宏。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。关于宏的一个常见应用就是,用它定义数值常量的名称:

define #ARRAY_SIZE 100
double data[ARRAY_SIZE];

这两行代码为值 100 定义了一个宏名称 ARRAY_SIZE,并且在数组 data 的定义中使用了该宏。惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量。上述简单的示例也展示了宏是怎样让 C 程序更有弹性的。

C++里的模板:模板函数定义的一般形式如下所示:

template <typename type> ret-type func-name(parameter list) { // 函数的主体 }

3、应用不同

C语言的宏:以表格形式输出一个函数的值,该程序使用了嵌套的宏。

#include <stdio.h>
#include <math.h>                          // 函数cos()和exp()的原型
#define PI              3.141593
#define STEP    (PI/8)
#define AMPLITUDE       1.0
#define ATTENUATION     0.1                      // 声波传播的衰减指数
#define DF(x)   exp(-ATTENUATION*(x))
#define FUNC(x) (DF(x) * AMPLITUDE * cos(x)) // 震动衰减
// 针对函数输出:
#define STR(s) #s
#define XSTR(s) STR(s)                   // 将宏s展开,然后字符串化
int main()
{
  double x = 0.0;
  printf( "\nFUNC(x) = %s\n", XSTR(FUNC(x)) );          // 输出该函数
  printf("\n %10s %25s\n", "x", STR(y = FUNC(x)) );             // 表格的标题
  printf("-----------------------------------------\n");
  for ( ; x < 2*PI + STEP/2; x += STEP )
    printf( "%15f %20f\n", x, FUNC(x) );
  return 0;
}

C++里的模板:返回两个数最大的值。

#include <iostream>
#include <string>

using namespace std;
 
template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{

    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 

    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 

    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 
 
    return 0;
}

二、使用#define定义宏函数

预处理器对宏指定的文本进行简单替换,因此可以使用编写简单的函数。宏函数通常用于执行非常简单的计算,相比于常规函数调用,宏函数的优点是:

  • 在编译前就地展开
  • 改善代码的性能
  • 无需考虑数据类型

宏是简单的替换,对于宏函数一定要使用括号保证替换后的功能逻辑正确,这是使用宏函数中经常犯错误的点。正是宏不进行类型检查,所以使用宏函数可以作用于不同的变量类型。宏函数不像常规函数那样在函数调用时需要创建调用栈、传递参数等,这些开销占用CPU的时间通常比常规函数的执行时间还多。所以,对于简单的函数,通常可以使用宏函数进行。但是宏不支持任何形式的类型安全,而且复杂的宏调试起来不方便。如果比那些独立于类型的泛型函数,又要保证类型安全,可使用模板函数,而不是宏函数,如要改善性能,可以定义为内联函数,使用关键字inline,这样就完全覆盖了宏函数的优势。

三、C++模板的非类型形参

  1. 模板的非类型形参也就是内置类型形参,如template class B{};其中int a就是非类型的模板形参。
  2. 非类型形参在模板定义的内部是常量值,也就是说非类型形参在模板的内部是常量。
  3. 非类型模板的形参只能是整型,指针和引用,像double,String, String **这样的类型是不允许的。但是double &,double *,对象的引用或指针是正确的。
  4. 调用非类型模板形参的实参必须是一个常量表达式,即他必须能在编译时计算出结果。
  5. 任何局部对象,局部变量,局部对象的地址,局部变量的地址都不是一个常量表达式,都不能用作非类型模板形参的实参。全局指针类型,全局变量,全局对象也不是一个常量表达式,不能用作非类型模板形参的实参。
  6. 全局变量的地址或引用,全局对象的地址或引用const类型变量是常量表达式,可以用作非类型模板形参的实参。
  7. sizeof表达式的结果是一个常量表达式,也能用作非类型模板形参的实参。
  8. 当模板的形参是整型时调用该模板时的实参必须是整型的,且在编译期间是常量,比如template class A{};如果有int b,这时A m;将出错,因为b不是常量,如果const int b,这时A m;就是正确的,因为这时b是常量。
  9. 非类型形参一般不应用于函数模板中,比如有函数模板template void h(T b){},若使用h(2)调用会出现无法为非类型形参a推演出参数的错误,对这种模板函数可以用显示模板实参来解决,如用h(2)这样就把非类型形参a设置为整数3。
  10. 非类型模板形参的形参和实参间所允许的转换。

延伸阅读

模板声明的类型

模板声明可以是:

  • 函数的声明或定义
  • 类的声明或定义
  • 类模板的成员函数或成员类的声明或定义
  • 类模板的静态数据成员的定义
  • 嵌套在类模板中的类的静态数据成员定义
  • 类或类模板的成员模板的定义

文章标题:C语言的宏与C++里面的模板有什么区别,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/48349

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Z, ZLWZ, ZLW认证作者
上一篇 2023年3月31日
下一篇 2023年3月31日

相关推荐

  • 核桃编程是用的什么编程软件

    核桃编程的编程软件是专门为儿童和青少年设计的教育型编程平台,旨在通过趣味性和互动性强的编程学习方式培养孩子们的逻辑思维和创新能力。在这个平台中,学员可以通过图形化编程语言进行项目构建,其中常用的软件包含Scratch、Code.org等。 核桃编程平台通过引导学生从简单的拖拽式编程入门,逐步过渡到更…

    2024年5月1日
    600
  • 学习编程到底是什么意思

    在探讨编程的真正含义时,我们首先应认识到它不仅仅是一系列代码的组合,而是一门创造与解决问题的艺术。1、编程意味着将抽象问题具体化,通过计算机语言为问题提供解决方案。对于这一点,重要的是理解编程不单单关乎技术层面的掌握,它还涉及到逻辑思维、创新能力以及解决问题的策略。通过编写代码,我们不仅可以指导计算…

    2024年4月27日
    2700
  • 手机小学编程下载什么

    手机学习编程可以选择各类编程学习应用、在线教育平台以及互动式编程工具。其中,1、针对儿童编程教育的应用,2、提供全龄编程课程的在线平台,3、游戏化编程学习工具,是受欢迎的几类选择。 以针对儿童编程教育的应用为例,它往往设计为互动式和寓教于乐的形式,使儿童在玩耍的过程中学会编程的基本概念和技能。这类应…

    2024年4月26日
    2300
  • 项目部如何管理财务人员

    项目部管理财务人员要求严格遵守财务管理制度、确保账目清晰、重视预算控制、积极进行财务风险评估、保持良好的团队沟通。严格的遵守财务管理制度是项目部管理财务人员的首要任务,因为这能确保所有财务活动都在一个清晰定义的框架内进行,有助于预防舞弊和错误。 一、建立和完善财务管理制度 建立和完善财务管理制度是确…

    2024年4月10日
    6700
  • 为什么vscode用谷歌运行的

    使用Visual Studio Code(VSCode)通过浏览器运行谷歌,主要有以下优势:速度快、扩展性好、跨平台、云端集成方便、提供丰富的开发工具和插件。扩展性好是其重要特点之一,VSCode提供了一个开放的平台,允许开发者通过安装扩展插件来增加新的功能和支持更多的编程语言。开发者可以轻松安装G…

    2024年4月3日
    6800
  • dsp用什么语言编程

    摘要 在开发Demand Side Platform(DSP)系统时,主流使用的编程语言包括:1、Python、2、Java、3、C++、以及4、Go。Python因其简洁性、广泛的库支持及社区资源而成为广告科技行业内广泛使用的一种语言。Python在数据处理、算法实现和快速原型开发方面展现出了巨大…

    2024年4月25日
    3700
  • 小孩的乐高编程是什么

    小孩的乐高编程是一种结合了乐高积木与编程教育的创新学习方法。它使得孩子们在搭建乐高模型的同时学习编程的基本概念和技能。其中,1、刺激创造力和解决问题的能力是它的核心优势之一。通过这种方式,孩子们在玩耍过程中,不只是在物理层面上搭建模型,而是通过编程让模型“活”起来,这极大地增加了活动的趣味性和教育价…

    2024年4月27日
    2600
  • 数控编程中M3代表什么

    数控编程中,M3代表主轴正转启动。在数控编程指令中,M开头的代码通常用于控制机器的辅助功能,而M3具体指令负责开启机床的主轴并使其以预设的速度正向旋转。这条指令在机床开始加工工件之前执行,它能确保主轴按照正确的方向和速度旋转。例如,在车削工件时,M3会启动机床的主轴,使之按照程序中设定的转速旋转,从…

    2024年4月29日
    1700
  • 什么是ASPICE

    Aspice(Automotive SPICE) 中文翻译为汽车软件过程改进及能力评定。是为保证软件质量的规范,要求供应商按照Automotive SPICE的要求进行产品的设计与开发。是汽车行业中常用于质量管理的工具。 一、什么是ASPICE Aspice(Automotive SPICE) 中文…

    2023年7月27日
    55300
  • 苹果手机游戏是用什么编程

    苹果手机游戏主要利用Objective-C、Swift、以及更现代的跨平台技术进行编程。其中,Swift是最受推荐的选择,因为它是由苹果公司创建的,专门为iOS开发设计,且易于学习,拥有强大的社区和资源支持。Swift的安全性和速度得到了广泛认可,能够帮助开发者高效地创建应用。尤其在处理图形和动画时…

    2024年4月27日
    4700

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部