关于inline函数的有关问题
关于inline函数的问题我对于inline函数的理解是:它基本上是用来取代C中带参数的宏.比如对于函数:inline f(
关于inline函数的问题
我对于inline函数的理解是:它基本上是用来取代C中带参数的宏.
比如对于函数:
inline f(int a){return sizeof(a);}
调用f(5);/*只考虑实参为常量表达式的情况*/
在编译的时候将被展开为 sizeof(5)进而被编译器算出
结果是4
也就是说f(5)可以认为是一个常量表达式//对不对?我觉得是
可是对于:
C/C++ codeint 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首先就是一个函数,函数可以返回任何值,inline也可以返回任何值。inline的展开不是在预处理期(区别于宏),而是在编译器,语法分析之后。enum需要常量,但函数不保证返回常量(当然),所以语法分析就会产生错误。
[解决办法]inline不是在语法分析之前展开的,先语法分析,最后生成汇编的时候才给你展开的。
[解决办法]常量表达式不包含函数调用表达式,所以这个从语法上就是错的,无论编译器如何分析都不能违背这一点……
[解决办法]我没看到权威的说法,但我根据编译原理课程中学到的,编译器的过程中推断的,你即使不是inline的,在enum中调用函数也不对吧。编译器首先扫描程序,生成各种符号表,在语法分析阶段看到enum里面的函数调用就不对了。有可能在生成符号表的时候就会认为enum中函数调用不对。
当然你可以看 提高c++性能中关于内联的介绍部分。