cpp-tbox项目链接 https://gitee.com/cpp-master/cpp-tbox
cpp-tbox( 全称C++ Treasure Box,C++百宝箱),是一个基于 Reactor 模式的服务型 开发框架 与 组件库。
主线程以 Reactor 模式处理非阻塞 IO 事件,并配合 ThreadPool 执行大运算与阻塞性操作。
该模式避免了多线程模式竞态加锁的烦恼,程序稳定可靠。
本人从2023年8月份开始使用这个框架以来,至今(2024年5月)已将近10个月。使用起来还是十分的舒服,框架提供了非常实用的开发组件(通信库、线程池、定时器池、协程、日志、命令终端、状态机、行为树等),使得开发者能够专注于业务逻辑开发,不用接触晦涩的系统调用接口。
cpp-tbox的作者拥有13+年C++开发经验,代码风格十分干净,附带单元测试用例,质量可靠。整体代码使用C++11标准,是学习Modern C++的好教材。
我们永远写不出我们没有看到过的代码,阅读优秀的开源代码是提高代码设计能力的一个途径,让我们一起来挖挖cpp-tbox中的宝藏,学习、吸收其中优秀的设计!
弱定义
学过C/C++的都知道,main函数是程序的入口点,是程序开始执行的地方。每个可执行的C或C++程序必须包含一个main函数。
但是参照官方提供的demo,我们会发现:demo没有定义main函数,编译竟然没有报错,而且生成的可执行文件还能运行!
阅读源码,其实能够发现,main函数在库里面定义并实现了,只不过被__attribute__((weak))修饰:
__attribute__((weak))
int main(int argc, char **argv)
{
return tbox::main::Main(argc, argv);
}
在C和C++编程中,attribute((weak))是一个编译器特性(attribute),主要用于告诉编译器或链接器对待特定的函数或全局变量为“弱定义”(weak definition)。
这意味着如果有其他地方提供了强(strong)定义,那么弱定义会被覆盖;如果没有强定义,弱定义则会被使用。
同样地,还有以下接口使用了弱定义:
void RegisterApps(Module &apps, Context &ctx);
std::string GetAppDescribe();
std::string GetAppBuildTime();
void GetAppVersion(int &major, int &minor, int &rev, int &build);
void OnAbnormalExit();
如果用户不自己实现,库中有一个默认的实现,如果用户实现了,最终就会覆盖默认实现。
总结
- 弱定义对于库和框架开发尤其有用,允许库提供默认实现,但允许最终用户覆盖这些实现。