首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于inline函数的有关问题

2012-02-05 
关于inline函数的问题我对于inline函数的理解是:它基本上是用来取代C中带参数的宏.比如对于函数:inline f(

关于inline函数的问题
我对于inline函数的理解是:它基本上是用来取代C中带参数的宏.
比如对于函数:
inline f(int a){return sizeof(a);}

调用f(5);/*只考虑实参为常量表达式的情况*/
在编译的时候将被展开为 sizeof(5)进而被编译器算出
结果是4

也就是说f(5)可以认为是一个常量表达式//对不对?我觉得是

可是对于:

C/C++ code
int main(){  enum{ A=f(5) };}

为什么编译报错?//VC6和VS2005下都报错?
说f(5)的地方需要一个常量表达式.

这是怎么回是?编译器的问题吗?

[解决办法]
inline函数在它被调用的地方被展开,省去了调用的堆栈开销。有可能在某些情况下,一些inline被优化成常量。

你这里enum跟inline没什么关系吧,enum定义类型,中不能调用函数吧。编译器无法给你替换。
[解决办法]
与常量没有任何关系。
一些资料在介绍宏的危害时,可能会提到inline函数有宏的效率,但两者不是一回事。
inline与否,取决于编译器。
用户的inline声明,只是向编译器提出的建议!

一般来讲,在类的定义体中写的成员函数,默认都会被编译器inline掉,甚至连inline的声明都不需要。
编译器的参数,可以控制inline的尺度:比如VC的/Ob0 /Ob1
[解决办法]
up Loaden~~
inline 只是对编译器提出要求,编译器会根据具体情况决定是否把函数代码嵌入到调用的地方
枚举中也不应该有函数~~
[解决办法]
探讨
我觉得
inline f(int a){return sizeof(a);}
这样的inline请求应该会被编译器接受,而且我用release模式编译的.

[解决办法]
也就是说,inline首先就是一个函数,函数可以返回任何值,inline也可以返回任何值。inline的展开不是在预处理期(区别于宏),而是在编译器,语法分析之后。enum需要常量,但函数不保证返回常量(当然),所以语法分析就会产生错误。
[解决办法]
inline不是在语法分析之前展开的,先语法分析,最后生成汇编的时候才给你展开的。
[解决办法]
常量表达式不包含函数调用表达式,所以这个从语法上就是错的,无论编译器如何分析都不能违背这一点……
[解决办法]
我没看到权威的说法,但我根据编译原理课程中学到的,编译器的过程中推断的,你即使不是inline的,在enum中调用函数也不对吧。编译器首先扫描程序,生成各种符号表,在语法分析阶段看到enum里面的函数调用就不对了。有可能在生成符号表的时候就会认为enum中函数调用不对。
当然你可以看 提高c++性能中关于内联的介绍部分。

热点排行
Bad Request.