由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - inline function是否可以递归?
相关主题
C++类的静态函数对成员函数c++ class definition
问个C++编译器如何处理函数内的static 变量c++中的inline 函数是做什么的?
请教一个static 函数的问题所谓FP就是 递归+pattern matching?
C编译器为何允许一个函数在某个路径不返回值?static如何作为函数?
inline functions in C++a C++ question
What happens when recursion functions are declared inline?A tech question (转载)
问一个问题,面试被问倒了哪位大牛简单说说compiler里的bootstrap是干啥用的?
关于inline function里的static variablefunction declaration
相关话题的讨论汇总
话题: inline话题: function话题: 函数话题: definition话题: static
进入Programming版参与讨论
1 (共1页)
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里,一个是结构琐碎、可读性差,再一个是编译器优化非常困难。

相关主题
What happens when recursion functions are declared inline?c++ class definition
问一个问题,面试被问倒了c++中的inline 函数是做什么的?
关于inline function里的static variable所谓FP就是 递归+pattern matching?
进入Programming版参与讨论
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不
: 会。

1 (共1页)
进入Programming版参与讨论
相关主题
function declarationinline functions in C++
[合集] 关于template和inheritance的问题请教What happens when recursion functions are declared inline?
关于C++ STL编译的疑问问一个问题,面试被问倒了
问一个简单的C++问题关于inline function里的static variable
C++类的静态函数对成员函数c++ class definition
问个C++编译器如何处理函数内的static 变量c++中的inline 函数是做什么的?
请教一个static 函数的问题所谓FP就是 递归+pattern matching?
C编译器为何允许一个函数在某个路径不返回值?static如何作为函数?
相关话题的讨论汇总
话题: inline话题: function话题: 函数话题: definition话题: static