今天在OPenOffice源码中看到一个类中的inline函数是在.cxx文件里定义的,并且在多个.cxx文件中定义,感觉甚是奇怪。所以做了些研究。
1.将函数声名为inline,表示要求编辑器在每个函数调用点上,将函数的内容展开,这样就省去了函数调用的开销,提高函数调用的效率.
2.more effective C++中就建议要多使用inline 和const而尽量少用#define!
虽然他们的功能好象是一样的,但inline比#define在出错后要 便于发现错误的出处!宏总是被扩展,但inline函数不总是被直接插入!
3.不过对于比较大的函数不宜使用inline,因为会造成代码膨胀。
4.即使你把函数定义为inline,但编译的时候是当成函数调用,还是宏替换,取决于编译器优化的结果.
就是说有的inline函数也会被当成一般函数进行调用.
5.inline相当于类型安全的宏,与其他函数在link期间连接不同,它是编译期间进行扩展的,最好在头文件中定义。template也一样。
6.inline 可以放在 .cpp 中,但此时只有本 cpp 文件可以用它。
如果要做成公用的,就必须放在 .h 中,如果不想放在 .h 中,就必须每个 cpp 文件拷贝一份。
其实,即使放在 .h 中,也是每个 cpp 文件拷贝一份的,只不过是编译器替你完成这种拷贝罢了。
inline 函数重复出现不会导致连接错误,即可以重复定义,所以是例外啦,其它函数(指可以在头文件中露面的函数)能重复定义吗?
7. C++ 中的 const 其实是一种特殊的变量,除了不允许你修改它的值,其它方面与变量没有任何(任何两个字应该加着重号)区别。
const 的缺省作用域是 extern。
const int x = 1234;
这种东东头文件里很常见。而且它相当于:
extern const int x = 1234;
如果把 const 去掉,就成了
extern int x = 1234;
但 extern int x = 1234; 是不允许出现在头文件里的,因为可能引起连接错误。
extern int x; 是变量声明,extern int x = 1234; 却是变量声明加定义。变量可以反复声明,只要不互相矛盾,但定义只能一次。
但是 const int x = 1234; 也同样是全局“变量”定义(如果是声明,就该是 const int x;),却可以出现在头文件里,当 多个 cpp 文件包含了这个头文件,就相当于每个 cpp 文件里都有了一个“全局变量”x 的定义。这却是合法的,所以也是例外。