inline函数的一些思考

今天遇到一个问题,在利用xxx.so库链接成可执行文件的时候,xxx.so有好几个函数符号一直报"undefined reference "的错误,仔细检测了很多遍,那几个函数确实是申明且定义了的。折腾一下午,后面发现这些函数被定义了成了inline函数,其实看到inline函数的时候也并没有想到是这个错误,只是试探性的把它去掉之后,卧槽,这个错误竟然消失了。

发现错误之后仔细想了一下,inline函数在调用的地方是直接展开的,这个过程在程序编译的时候就完成了,所以在链接的时候在符号表里就不存在inline函数的符号索引了,当然就会报这个错误了。

所以解决这个问题主要就是需要在预编译阶段把调用的地方的inline函数全部展开,所以inline函数得写在头文件里而不是源文件里

举例,有一个类HELLO中实现了一个inline函数print(),然后在main.cpp文件中试图使用HELLO中的inline函数,那么在编译生成main可执行文件的时候则会报"main.cpp:(.text+0xe9): undefined reference to `HELLO::print()'"错误:

#ifndef HELLO_H_
#define HELLO_H_

#include
#include

class HELLO
{
    public:
        HELLO();
        explicit HELLO(std::string str);
        void print();
        
    private:
        std::string     _str;
};
#endif
#include "hello.hpp"
HELLO::HELLO()
{
    _str = "WORLD";
}
HELLO::HELLO(std::string str)
{
    _str = str;
}
inline void HELLO::print()
{
    std::cout << _str  << std::endl;
}
#include "hello.hpp"
int main()
{
    HELLO hello("hello");
    HELLO world("world");

    hello.print();
    world.print();

    return 0;
}

把上面的inline函数print写在头文件中这不会有任何问题。

你可能感兴趣的:(inline函数的一些思考)