C++内联函数问题

函数前不写关键字inline 还是不是内联函数啊 刚才看视频里说函数声明定义在一行就是内联函数 并且我注意到函数前没关键字inline 难道判断是不是内联函数不是依靠关键字吗?求解

如果你需要内联函数,请务必使用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关键字的函数,在开启编译器优化的情况下,编译器也会根据具体这个函数的使用范围自行转换为内联函数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-03
在函数定义和声明时用inline指定为内联函数,也可以只在其中一处声明为内联,都可以
第2个回答  2012-03-03
在函数定义的前面要写关键字inline
否则不能和其他的函数区分开来啊追问

也就是说函数的声明和定义在一行 就是内联函数 这么理解没错吧?

追答

对啊

本回答被提问者采纳
相似回答