查缺补漏——define和inline

2024-08-22 04:58
文章标签 define inline 补漏 查缺

本文主要是介绍查缺补漏——define和inline,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先#define有很大的好处:

 1.首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。

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

然而#define定义函数时是有个很大的缺陷:

#define用参数时,是严格的替换策略。无论你得参数时何种形式,在展开代码中都是用形参替换实参。

#define 宏不同的是,内联函数总是对参数只精确地进行一次求值,从而避免了那声名狼藉的宏错误。换句话说,调用内联函数和调用正规函数是等价的。

下面这段代码就很明显看出两者的差距:

#include <iostream>
using namespace std ;
#define Max( a , b ) ( a > b ? a : b ) ;
inline int fun( int a , int b )
{
 return ( a > b ? a : b ) ;
}
int main()
{
 int a , b ;
 a = 3 ;
 b = 0 ;
 Max( ++a , b ) ;
 cout << a << endl ;
 a = 3 ;
 b = 5 ;
 Max( ++a , b ) ;
 cout << a << endl ;
 a = 3 ;
 b = 0 ;
 fun( ++a , b ) ;
 cout << a << endl ;
 return 0 ;
}

输出为:

5

4

4

唔。。。。。。郁闷。。。。。。我想Max( ++a , b ) ;那绝对不是你想要得到的结果。

原因就是,哎我想你猜也能猜出来了。

万一你要是还不知道,你就去看看effective c++  吧。我真的懒得在费口舌了

 inline函数和用macro定义的函数区别 

macro
定义
 
只是很初级的一种代换,实现的功能很单一
 
而且安全性很差,比如类型错误、括号漏写
 
都会造成很大的错误,
 
而且错误不容易被发现,隐患很大 

inline函数 
内联函数要比前者好很多
 
功能也要全面很多!
 
最主要的是
       
内联函数能够进行安全检查(比如参数类型   等)
 
如果在能够使用两着的情况之下
 
推荐使用   内联
       

不过有两点要注意:
 
1    
内联   是以代码膨胀为代价的,
   
     
不是所有的函数都适合用   内联   方式
 
     
要考虑函数的实际情况
   
2     macro
定义   也不是说一无是处了
 
     
在合适的时候使用   也许会有意想不到的效果 

 

 

这篇关于查缺补漏——define和inline的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095303

相关文章

2、#include和#define

#include和#define 一、#include二、#define宏定义1、宏变量2、宏函数 一、#include #include是预处理指令,会将头文件直接替换到文件中。 // hello.hvoid foo() {int c = 0;int d = 1;}// hello.cpp#include "hello.h"int main() {int a =

const与#define的优缺点

1.define由预处理程序处理,const由编译程序处理 2.#define不分内存,因为它是预编译指令,编译前进行了宏替换。const 不一定?某种说法,Const常量是占有内存的被“冻结”了的变量 3.const定义常量是有数据类型的,这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际

【C++】define宏定义中的#,##,@#及\符号

一、# 名称:字符串化操作符 其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前 举例: #define example1(instr) #instr string str=example1(abc); 将会展成:string str="abc"; 注意:对空格的处理 a、忽略传入参数名前面和后

C++内联函数(C++ inline)详解

使用函数能够避免将相同代码重写多次的麻烦,还能减少可执行程序的体积,但也会带来程序运行时间上的开销。 函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中,最后才跳转到函数内部执行。这个过程是要耗费时间的。 另外,函数执行 return 语句返回时,需要从栈中回收形参和局

nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R

用proguaid 只混淆Android项目的src下的包的话,如果出现了上面的问题: nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R 1.如果你想开发Androidsdk 首先把你的项目的src下面打一个包。 2.然后用proguaid混淆。混淆的时候,有时候老是不成功,然你解决上面的

考试知识点查缺补漏

虚实地址转换: 增大快表容量可以增加地址转换速度 增大交换区对虚实地址转换无影响 文件首次打开: 将文件的FCB调入内存 管道只能单向 USB属于设备总线 海明码: 数据位n 校验位k 纠错至少满足 2 k > = n + k + 1 2^k>=n+k+1 2k>=n+k+1 RAID0::无冗余,无娇艳 RAID1-5:加入了冗余 条带化数据分片,同时读写至不同磁盘,提高读写速度的技术

【C++】探索inline关键字:用法、限制与示例代码

文章目录 前言相关性质用法优点限制和注意事项inline 函数的定义位置inline 和类成员函数inline 和 constexpr 前言 我们知道:对于C、C++,在编译时遇到函数调用时,编译器会生成一个函数调用的代码,这包括跳转到函数的地址和处理返回值;这个操作会有一定的开销; inline 关键字 在 C++ 和 C 编程语言中用于指示编译器尝试将函数的代码直接插入到

宏__cplusplus/////ifnbsp;define…

在C与C++混合编写的代码中,我们常常会在头文件里看到如下的声明:   #ifdef __cplusplus //如果定义了表示是c++编译器extern "C" {  #endif  // 在这里写标准c程序   #ifdef __cplusplus  }  #endif   __cplusplus是c++编译器内部定义的宏,如果使用的c编译器__cplusplus不会被定义,所以它用来区分

#define和预处理指令的使用

今天再总结一点#define和预处理指令的使用。 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。正行语句构成了一条预处理指令,该指令酱紫啊编译器进行编译之前对源代码做某些转换,下面是一些常用的预处理指令, #    空指

汇编语言中出现#include, #define的问题

U_boot源文件中,一些 .S文件中出现了#include, #define,如board\smdk2410目录下的lowlevel_init.S文件: #include <config.h> #include <version.h> /* some parameters for the board */ /*  *  * Taken from linux/arch/arm/boot/co