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<string>
#include<iostream>

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写在头文件中这不会有任何问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容