使用inline声明函数编译不报错
㈠ C++inline函数的定义和声明方法怎么用
inline:是用于声明内联函数的关键字
什么是内联函数呢?就是将函数作为像宏一样的东西,在编译的时候直接将函数在调用处展开.这样就能避免调用函数的开销,所以inline应该用在代码很少的,并且调用频率相当大,并且对效率要求很高的场所.和宏不一样的地方就是,编译器会对内联函数进行各种正常函数应有的检查,比如参数是否传递正确等等,宏就是完全替换,编译器不会在替换前对宏进行检查.当然使用inline还有许多其它的好处,不过我这样简单的回答应该能让您大概明白了吧,望采纳,谢谢...
㈡ 关于C++中的inline函数
内联函数:
在C++中,为了避免主函数过于复杂,编程时会设置大量的子函数,而这样做降低了主函数的复杂性的同时却使得整个程序的执行效率降低,因为在进行函数调用时,系统需要时间及内存空间来保存现场信息,为了解决这个问题,C++中设了内联函数的概念(inline函数)。
在函数编写过程中,内联函数的编写完全遵循子函数的编写规则,这样就使得代码同样都是比较简便的,然而不同之处出现在代码编译过程中,代码编译时会用内联函数主体替换函数调用部分,从而使得编译完成的程序是顺序执行下去的而不必再进行函数调用。
我们看下面的函数,函数体中只有一行语句:
double Average(double total, int number)
{
return total/number;
}
定义这么简单的函数有必要吗?实际上,它还是有一些优点的:第一,它使程序更可读;第二,它使这段代码可以重复使用。但是,它也有缺点:当它被频繁地调用的时候,由于调用函数的开销,会对应用程序的性能有损失。例如,Average在一个循环语句中重复调用几千次,会降低程序的执行效率。
那么,有办法避免函数调用的开销吗?对于上面的函数,我么可以把它定义为内联函数的形式:
inline double Average(double total, int number)
{
return total/number;
}
函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函数的程序代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但是对于一些函数体代码很短,但又被频繁地调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
使用内联函数时应注意以下几个问题:
(1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。
(2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。
(3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。
(4) 内联函数要在函数被调用之前声明。例如下面的代码将内联函数放在函数调用之后声明,不能起到预期的效果。
㈢ 求助!!关于C++中内联函数的一些问题
在类中定义的成员函数全部默认为内联函数。可以显示加上 inline 标识符。或者不加
在类中声明的成员函数,如果没加inline。则在类外定义该成员函数时加了inline,该成员函数也为内联函数。
反正不管是声明还是定义,只要看见有 inline ,都为内联
存在的意思
#include <iostream>
using namespace std;
int main()
{
cout<<print();
return 0;
}
int print(){return 1;}
你就找不到定义了
㈣ C++ 问题
你这个理解不对。。。你的理解更像是简单的复制了,那样就跟宏(Macro)没什么区别了
书上的意思是“功能”的直接复制,此处你可以认为func()等价于一个变量,值为1;
一般很短的几句代码的函数,建议使用inline修饰,减少函数调用的开销。
return 1;只是函数的内部写法,具体在调用这个inline函数时,背后的细节由编译器处理,生成了对应的指令,你不需要管函数内部的语句。
----------------
另外,你的代码中好几处错误。
1. 应该为 inline int func而不是void func
2. mian应该是main
㈤ C语言有内联函数吗
这个是内联函数。
C语言本身是不支持内联函数的,在最新的C标准C99中C语言支持了内联函数。
C++支持内联函数。
从编译器的角度:
有些C语言编译器,例如GNU C提供了内联函数的支持。
所有C++编译器都支持内联函数。
如果你的C语言编译器不支持内联函数,看看它有多古老,太古老不行(例如 Turbo C 2.0)。如果是C/C++合体编译器,那就切换到编译C++模式(例如VisualC++)。
㈥ C中函数inline定义问题,求解释。。。。
你没有给出具体源码,所以只能猜,据我所知,有一种情况可能符合你的描述:
这种用法,同一个文件内的inline test函数会被内联展开,其他文件的test函数,会编译成普通函数来调用。
根据你的提问可以理解为:abc.h中的test函数,被abc.h内联展开。abc.c中的test函数,被abc,c调用,与abc.h里面的test无关。如果还有def.c调用test,那么调用那个的是abc.c中的。前提是abc.c和def.c不包含abc.h,如果包含abc.h那么调用test函数的地方,会被abc.h中的test函数进行内联展开。
GCC编译器和 C99编译器代码有所不同,都可能能达到你描述代码的要求,说可能是因为我只在gcc编译器上编译过类似代码,c99的用法是网络文章说的,我没试过,所以只能说可能。
㈦ C++内联函数问题
如果你需要内联函数,请务必使用inline关键字。
如果不适用inline关键字,函数可能内联,也可能不内联。结果由你使用的C++编译器决定。
早期C++编译器,在C++刚刚引入inline的概念的时候,必须写inline才是内联。不写就不是。
但是因为内联函数的效率比较高,以及减少一些编译时候的错误,所以后来的编译器会选择在没有写inline的函数,如果可以也尽量自动生成内联函数(就是在编译的时候由编译器决定是不是要自动加上inline)。而自动加inline的规则之一就是如果你的函数没有写inline,但是在头文件中直接申明+定义,就自动加上inline(否则还可能出现编译错误),所以就有了默认的inline的情况。特别是class member function,如果你直接申明后面直接定义就会产生inline的效果,即便你不适用inline。但是有的编译器也不自动加上Inline。
而另外一种情况,头文件声明函数,又分开写了函数定义,没有Inline,本身来说这应该是错误的,会导致多次引用同一个头文件过后,函数重复定义。但是现代新的编译器为了避免错误就自己加上Inline了,但是你可能换一个又不加了,于是就有错误了。或者你把编译器优化关掉了,编译器不自动添加inline这样的你函数定义就会产生错误。
所以实际情况中,虽然在头文件中,像你说的不加inline然后在头文件里面定义声明一行,就自动产生inline是事实。但是自动产生的结果其实是不可预测的,如果你不清楚你使用的编译器版本的规则,就会觉得好像是看编译器心情一样,搞不清楚最后的结果到底在加还是没加。而有时候你加了inline,编译器还是会选择不内联你的函数。所以不管VC还是GCC还是Intel c++编译器都不像你所认为它应该的工作方式工作,即使是有很多经验的程序员有时候也无法判断。
于是实际中,如果你需要函数内联,那一定要使用inline关键字。不需要内联的函数,就不要加。然后非内联函数,绝对不要再头文件中定义(只声明)。否则会产生不可预测的结果。不要因为部分“聪明”的编译器允许你省略inline就不加,这样只会给你带来不必要的麻烦。
因为这些自作聪明的编译器,所以现在比较新的主流C++编译器都只把inline关键字当做一个提示,具体是不是产生内联函数由编译器自己决定。大概你记住如果有inline关键字,编译器会尽量产生高效的内联函数,但是也不一定会。一些你认为不会内联没有Inline关键字的函数,在开启编译器优化的情况下,编译器也会根据具体这个函数的使用范围自行转换为内联函数。
㈧ C++ 内置函数(inline)
在函数规模很小的情况下,函数调用的时间开销可能相当于甚至超过执行函数本身的时间,把它定义为内置函数,可大大减少程序运行时间。内置函数中不能包括复杂的控制语句,如循环语句和switch语句。
应当说明:对函数作inline声明,只是程序设计者对编译系统提出的一个建议,也就是说它是建议性的,而不是指令性的。并非一经指定为inline,编译系统就必须这样做。编译系统会根据具体情况决定是否这样做。
㈨ 在什么情况下适宜采用inline定义内联函数
使用高度频繁,而且操作内容简单的情况下,用inline函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。
inline定义格式
一、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。
表达式形式的宏定义如:
#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))
取代这种形式的原因如下:
1、C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作。因此,效率很高,这是它在C中被使用的一个主要原因。
2、这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型。这样,它的使用就存在着一系列的隐患和局限性。
3、在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。
4、inline推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。
(9)使用inline声明函数编译不报错扩展阅读
内联函数的不足
除了通常使用内联扩展可能带来的问题,作为一种编程语言特性的内联函数也可能并没有看起来那么有效,原因如下:
1、通常,设计编译器的程序设计者比大多数的程序设计者更清楚对于一个特定的函数是否合适进行内联扩展;一些情况下,对于程序员指定的某些内联函数,编译器可能更倾向于不使用内联甚至根本无法完成内联。
2、对于一些开发中的函数,它们可能从原来的不适合内联扩展变得适合或者倒过来。尽管内联函数或者非内联函数的转换易于宏的转换,但增加的维护开支还是使得它的优点显得更不突出了。
3、对于基于C的编译系统,内联函数的使用可能大大增加编译时间,因为每个调用该函数的地方都需要替换成函数体,代码量的增加也同时带来了潜在的编译时间的增加。
参考资料来源:网络-内联函数
参考资料来源:网络-inline