inline和宏之间的区别

1、内联函数在编译时展开,而宏在预编译时展开

2、在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。

3、内联函数可以进行诸如类型安全检查、语句是否正确等编译功能,宏不具有这样的功能。

4、宏不是函数,而inline是函数

5、宏在定义时要小心处理宏参数,一般用括号括起来,否则容易出现二义性。而内联函数不会出现二义性。

6、inline可以不展开,宏一定要展开。因为inline指示对编译器来说,只是一个建议,编译器可以选择忽略该建议,不对该函数进行展开。

7、宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。

如何使用类的inline函数:

  简单提一下inline 的使用吧:

  1.在类中定义这种函数:

  class ClassName{

  .....

  ....

  INT GetWidth(){return m_lPicWidth;}; // 如果在类中直接定义,不需要用inline修饰,编译器自动化为内联函数

  .... //此说法在《C++ Primer》中提及

  ....

  }

  2.在类外定义前加inline关键字:

  class Account {

  public:

  Account(double initial_balance) { balance = initial_balance; } //与1相同

  double GetBalance(); //在类中声明

  double Deposit( double Amount );

  double Withdraw( double Amount );

  private:

  double balance;

  };

  inline double Account::GetBalance() { return balance; } //在类外定义时添加inline关键字

  inline double Account::Deposit( double Amount ) { return ( balance += Amount ); }

  inline double Account::Withdraw( double Amount ) { return ( balance -= Amount ); }

  此外含有一些规则需注意:

  1、inline说明对对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如,你将一个长达1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。

  2、在调用内联函数时,要保证内联函数的定义让编译器""到,也就是说内联函数的定义要在头文件中,这与通常的函数定义不一样。但如果你习惯将函数定义放在CPP文件中,或者想让头文件更简洁一点,可这样做:

  //SomeInline.h中

  #ifndef SOMEINLINE_H

  #define SOMEINLINE_H

  inline Type Example(void);

  //........其他函数的声明

  #include“SomeInlie.cpp” //源文件后缀名随编译器而定

  #endif

  //SomeInline.cpp中

  #include"SomeInline.h"

  Type Example(void)

  {

  //..........

  }

  //...............其他函数的定义

  以上方法是通用、有效的,可放心使用,不必担心在头文件包含CPP文件会导致编译错误。

时间: 2024-10-14 08:38:01

inline和宏之间的区别的相关文章

display:block / inline / inline-block 三个之间的区别

块元素特点: 每次都是从新行开始: 可以设置宽.高,行高,顶底边距等: <div>  <ul> <ol> <li> <dl> <dt> <dd> <table> <form>  <p>  <hr/><textarea>等都是 行元素特点: 和别的元素在同一行: 不可以设置宽高,行高,顶底边距等: <span> <img> <var&g

微内核和单(宏)内核的区别

内核按照体系结构分为两类 : 微内核(microkernel)与宏内核(macrokernel). 微内核 是将各种服务功能放到内核之外,自身仅仅是一个消息中转战,用于各种功能间的通讯.宏内核 是将所有服务功能集成于一身,使用时直接调用.ps:服务功能有进程管理,内存管理等. 微内核的系统有WindowNT,Minix,Mach,etc. 宏内核的系统有Unix,Linux,etc. 下面拿Minix(微内核)和Linux(宏内核)举例: Minix与Linux创建新进程的过程比较可以看出二者之

C++中的内联函数和C中的宏定义的区别

在C++中内联函数: 内联函数即是在函数的声明和和定义前面加上“inline”关键字,内联函数和常规函数一样,都是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(这里为12),而宏定义则不同. 在C中的宏定义: C语言使用的预处理器语句#define来提供宏,例如:#define SQUARE(X)  X*X,这里宏并不是通过值传递来实现的,而是通过文本替换来实现的. 内联函数和宏定义的区别用下面的代码来观察: //内联函数 inline double squar

#if 与 #ifdef 之间的区别

先来看个例子: #define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA 0 #ifdef TARGET_LITTLE_ENDINA call little endina function #else call big endina function #endif 不管把 TARGET_LITTLE_ENDINA 和 TARGET_BIG_ENDINA 定义成 0 或者 1,甚至后面不写这个 0 或者 1 ,调用的都是 little end

KeyPress 和KeyDown 、KeUp之间的区别

前几天,在写完一个功能模块上线测试的时候,出现了一个诡异的问题.input 框在输入查询内容之后,按回车键居然有两种不同的表现形式(input 框没有绑定键盘事件),谷歌和火狐功能正常,但IE在按了回车键以后居然自动调用方法. 页面结构:标签上没绑定任何键盘事件,控制器内也没有给元素绑定键盘事件. <div class="search-input-tel search-input-visit-tel" > <input class="searchinput-

外发外协外包三者之间的区别与联系

1.应当贯彻顾客为中心原则,通过建立体系来控制过程,确保产品质量.不要化精力在符合标准要求上.如果您 的目标.产品的要求不切合顾客要求的话,就是符合了ISO 9001标准要求,不能满足顾客要求的,符合顾客要求了,顾客满意了,不注意质量成本,经济效益,也就不一定能赚到钱的. 2.7.4条采购要求是,如果您从质量管理体系外得到各种影响产品要求符合性的资源(过程也作为一种资源)的话,就必须对这些产品或者活动(也就是过程) 加以控制的."采购"英文是purchasing,"外包过程&

socket,tcp,http三者之间的区别和原理

http.TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP.SMTP.SNMP.FTP.Telnet.SIP.SSH.NFS.RTSP.XMPP.Whois.ENRP 6 表示层 例如XDR.ASN.1.SMB.AFP.NCP 5 会话层 例如ASAP.TLS.SSH.ISO 8327 / CCITT X.225.RPC.NetBIOS.ASP.Winsock.BSD sockets 4 传输层 例如TC

Android培训准备资料之UI一些相似控件和控件一些相似属性之间的区别

这一篇博客主要收集五大布局中的一些相似控件和控件一些相似属性之间的区别 ImageView ImageButton Button 三者有啥区别? (1)Button继承自TextView,ImageView继承自View,ImageButton继承自ImageView                                              (2)Button支持android:text属性,而ImageButton和ImageView不支持,但是ImageView和ImageB

JavaScript中this和$(this)之间的区别

jQuery中this和$(this)之间的区别: this返回的是当前对象的html对象,而$(this)返回的是当前对象的jQuery对象 举个正确的Demo实例: $("#textbox").hover( function() { this.title = "Test"; }, fucntion() { this.title = "OK”; } ); 以上的this为html元素即元素textbox,该元素有title属性,因此以上的程序没有错误.如