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)!