g*********s 发帖数: 1782 | 1 觉得不行。
但是,如果一个递归函数声明成inline,compiler怎么识别呢? |
g*********s 发帖数: 1782 | 2 http://stackoverflow.com/questions/190232/can-a-recursive-funct
这里的例子如果放进类定义,inline就是必须而不是建议了吧?
【在 g*********s 的大作中提到】 : 觉得不行。 : 但是,如果一个递归函数声明成inline,compiler怎么识别呢?
|
s********v 发帖数: 288 | 3 compiler可以ignore
【在 g*********s 的大作中提到】 : 觉得不行。 : 但是,如果一个递归函数声明成inline,compiler怎么识别呢?
|
h********n 发帖数: 1671 | 4 inline的真正含义并不是内嵌,而是通知编译器这个函数会出现在多个模块,不要当成
是错误报出来。至于编译器如何处理模块间重复定义的问题,需不需要内嵌,那是编译
器的事,跟写不写inline关系不大。就算是设成inline或放进类定义,编译器觉得有必
要的话也可以不按内嵌处理。 |
P********e 发帖数: 2610 | 5
这个什么意思?什么模块?为什么有错误?
【在 h********n 的大作中提到】 : inline的真正含义并不是内嵌,而是通知编译器这个函数会出现在多个模块,不要当成 : 是错误报出来。至于编译器如何处理模块间重复定义的问题,需不需要内嵌,那是编译 : 器的事,跟写不写inline关系不大。就算是设成inline或放进类定义,编译器觉得有必 : 要的话也可以不按内嵌处理。
|
h********n 发帖数: 1671 | 6 简单说就是一个.cpp文件。常见的情况是两个.cpp引用了同一个.h文件,而.h文件里某
个函数忘记声明为inline,编译的时候linker会说某一个函数重复定义。加上inline后
就不会有这个错误。普通函数除了inline,还可以声明为static或是放在namespace{}
里。如果是类成员函数,就只能用inline了。这是必须用inline的地方。
LZ的例子,如果是定义在.h文件里而又被多个.cpp引用,就必须用inline、static或是
namespace{}之一。如果是类成员函数,就必须用inline,与是否递归和内嵌没有关系
。写上inline后,如果编译器决定不内嵌,也会自行处理重复定义的问题,不会报错。
【在 P********e 的大作中提到】 : : 这个什么意思?什么模块?为什么有错误?
|
P********e 发帖数: 2610 | 7 不过不应该把函数定义写在.h里,不是good practice。.h都应该只有forward
declaration, 防止不同的compilation unit有multiple definition。
用static or unnamed namespace就把函数意义改变了。
inline用法意义在class的function和free function里面不一样。
【在 h********n 的大作中提到】 : 简单说就是一个.cpp文件。常见的情况是两个.cpp引用了同一个.h文件,而.h文件里某 : 个函数忘记声明为inline,编译的时候linker会说某一个函数重复定义。加上inline后 : 就不会有这个错误。普通函数除了inline,还可以声明为static或是放在namespace{} : 里。如果是类成员函数,就只能用inline了。这是必须用inline的地方。 : LZ的例子,如果是定义在.h文件里而又被多个.cpp引用,就必须用inline、static或是 : namespace{}之一。如果是类成员函数,就必须用inline,与是否递归和内嵌没有关系 : 。写上inline后,如果编译器决定不内嵌,也会自行处理重复定义的问题,不会报错。
|
t****t 发帖数: 6806 | 8 just keep your c/c++ comment to yourself, alright?... FYI, inline function
definition should appear in .h otherwise there's no way to inline.
【在 P********e 的大作中提到】 : 不过不应该把函数定义写在.h里,不是good practice。.h都应该只有forward : declaration, 防止不同的compilation unit有multiple definition。 : 用static or unnamed namespace就把函数意义改变了。 : inline用法意义在class的function和free function里面不一样。
|
h********n 发帖数: 1671 | 9 inline就是为了把函数定义写进.h文件而设计的,否则一点用也没有了。将所有的函数
定义都写在.cpp里,一个是结构琐碎、可读性差,再一个是编译器优化非常困难。
【在 P********e 的大作中提到】 : 不过不应该把函数定义写在.h里,不是good practice。.h都应该只有forward : declaration, 防止不同的compilation unit有multiple definition。 : 用static or unnamed namespace就把函数意义改变了。 : inline用法意义在class的function和free function里面不一样。
|
P********e 发帖数: 2610 | 10 我的理解是这样你没办法hide definition。另外,既然是.cpp,这样的free function
理应很少。
【在 h********n 的大作中提到】 : inline就是为了把函数定义写进.h文件而设计的,否则一点用也没有了。将所有的函数 : 定义都写在.cpp里,一个是结构琐碎、可读性差,再一个是编译器优化非常困难。
|
|
|
P********e 发帖数: 2610 | 11 你可以leave me alone吗? 跟你说不到一起。
【在 t****t 的大作中提到】 : just keep your c/c++ comment to yourself, alright?... FYI, inline function : definition should appear in .h otherwise there's no way to inline.
|
t****t 发帖数: 6806 | 12 i wanted to. but would you stop posting wrong information? otherwise i feel
obliged to correct you.
【在 P********e 的大作中提到】 : 你可以leave me alone吗? 跟你说不到一起。
|
h********n 发帖数: 1671 | 13 hide definition是无关的问题,想hide definition的话,连模板都不能用,也不能有
带私有成员的类,那就干脆只用C算了。
.cpp与free function也无关。如果一段code在许多function里会用到,很自然写成一
个在.cpp中的free function,用inline、static、namespace{}都可以。
在编译器还很弱的时代,有的书上讲尽量减少函数调用,尽可能在一个函数里干所有事
,尽可能用宏代替函数调用,这种情况现在基本不存在了。相反,现在为了提高可读性
,最好不要写特别长的函数,最好用inline function(包括使用模板的inline
function)代替宏。
function
【在 P********e 的大作中提到】 : 我的理解是这样你没办法hide definition。另外,既然是.cpp,这样的free function : 理应很少。
|
P********e 发帖数: 2610 | 14 模板有技巧可以hide definition的。不过你说的情况比如一段code经常调用确实存在
,可能inline是个option。static只能在当前compilation unit用了。
【在 h********n 的大作中提到】 : hide definition是无关的问题,想hide definition的话,连模板都不能用,也不能有 : 带私有成员的类,那就干脆只用C算了。 : .cpp与free function也无关。如果一段code在许多function里会用到,很自然写成一 : 个在.cpp中的free function,用inline、static、namespace{}都可以。 : 在编译器还很弱的时代,有的书上讲尽量减少函数调用,尽可能在一个函数里干所有事 : ,尽可能用宏代替函数调用,这种情况现在基本不存在了。相反,现在为了提高可读性 : ,最好不要写特别长的函数,最好用inline function(包括使用模板的inline : function)代替宏。 : : function
|
h********n 发帖数: 1671 | 15 hide definition当然有许多技巧,我说的是你这样为了hide definition而不用语言的
某些feature的情况。
在.cpp里inline和static没区别,都是只能在当前compilation unit用。不过一个函数
定义为static却没有被实际调用到的话,编译器会给出一个warning,但是用inline不
会。
【在 P********e 的大作中提到】 : 模板有技巧可以hide definition的。不过你说的情况比如一段code经常调用确实存在 : ,可能inline是个option。static只能在当前compilation unit用了。
|
P********e 发帖数: 2610 | 16 可能强制inline只能在.h就是要使得,include .h的时候,每个compilation unit都有
一格definition。虽然static and inline效果一样,但还是要同时使用。static
inline void foo(){}
【在 h********n 的大作中提到】 : hide definition当然有许多技巧,我说的是你这样为了hide definition而不用语言的 : 某些feature的情况。 : 在.cpp里inline和static没区别,都是只能在当前compilation unit用。不过一个函数 : 定义为static却没有被实际调用到的话,编译器会给出一个warning,但是用inline不 : 会。
|