将函数体直接放在类体总的是内联函数的隐式声明
在类中给出的函数实现具有文件内部局部作用域
内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。
今天在coding时遇到多次定义一个函数而使ld返回错误的情况。大致过程如下:
首先,在一个头文件中定义了一个类及其实现:
test.h:
- #ifndef TEST_H
- #define TEST_H
- class A{
- public:
- void fun();
- };
- void A::fun(){
- }
- #endif
然后分别有两个文件:
a.cpp:
- #include"test.h"
- void tt()
- {
- }
b.cpp:
- #include<iostream>
- #include"test.h"
- using namespace std;
- void tt();
- int main()
- {
- A a;
- tt();
- return 0;
- }
想了想,是由于分开后在a.o和b.o中都分别定义了A的fun()函数,因此会发生冲突。
这里一般的解决方法是将定义放到类定义当中去,即将test.h改为:
test.h:
- #ifndef TEST_H
- #define TEST_H
- class A{
- public:
- void fun(){};
- };
- #endif
再次进行编译链接:
但是由于特殊原因,这里不方便这样做。
想了半天,想到链接是全局符号的确定与定位,那么如果函数不是全局变量,不就不用链接了么。
这里可以用内联函数!
可以将test.h改为:
- #ifndef TEST_H
- #define TEST_H
- class A{
- public:
- void fun();
- };
- inline void A::fun(){
- }
- #endif
测试后能正确编译链接,问题解决!
转载: http://blog.youkuaiyun.com/tobacco5648/article/details/7651073