自学内容网 自学内容网

C++ 隐式内联函数

在阐述隐式内联函数之前,可以先看下下列代码:

/* C */
#include <stdint.h>

namespace rest_api {
    class api_entry {
        public:
            api_entry()     = default;
            ~api_entry()    = default;
           static api_entry& get_instance()
            {
                static api_entry instance;
                return  instance;
            }

            /*  Start monitoring events transmitted by the server   */
            int32_t run();
    };

};  /* namespace rest_api */

这是我在开发Fast-cgi的程序时,写一个实现rest_api标准的组件,当我直接声明它来使用时出现了问题,下列是main里的用法:

#include "http/rest_api/rest_api.h"

int main()
{
    /* event loop */
    return rest_api::api_entry::get_instance().run();
}

虽然有声明,但是在构建时报错:

/usr/bin/ld: CMakeFiles/main.dir/src/main.cpp.o: in function `main':
main.cpp:(.text+0x9): undefined reference to `rest_api::api_entry::get_instance()'
collect2: error: ld returned 1 exit status

提示没有找到该函数的定义,原因是这样的,当你在类内部声明一个函数时除了构造函数、析构函数、模板函数、操作符重载函数以外的普通成员函数都会被隐式转换为内联函数,内联函数一般是不会分配内存空间的,不会产生符号定义,所以即便你声明了也会提示你找不到这个函数。
解决方案是把它作为lib或者使用编译器属性强制C++不要让其隐式转换为内联函数,下列是采用GNU G++属性的方式解决这个问题:

/*  Get a unique instance   */
/*  TODO: Writing implementations within a class
/*        except for constructor and destructor or operator
/*        overloading functions, will be considered as implicit
/*        inline functions 
*/
[[gnu::noinline]] static api_entry& get_instance()
{
  static api_entry instance;
  return  instance;
}

原文地址:https://blog.csdn.net/bjbz_cxy/article/details/142553097

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!