【C++】替代--whole-archive的一种方式 上篇文章《C++自动注册的工厂与--whole-archive》提到了--whole-archive选项在自动工厂示例的必要,“貌似也没其他方法了”。这篇文章介绍另一种可以替代的方式,并分析其优缺点,采用的代码示例同上篇文章。文章最后附代码。方法介绍ld链接器提供了另外一组选项解决符号依赖的问题。-u symbol--undefined=symbol上面的选项用来告诉链接器symbol符号在最终...
C++自动注册的工厂与--whole-archive 上篇文章《静态库和链接选项--whole-archive》提到--whole-archive的一个应用场景:C++自动注册的工厂,这篇文章来填坑。预备知识我们经常用工厂类或工厂方法统一管理资源,实现资源的创建和使用之间的解耦,调用者无需关心资源创建的细节,直接到工厂申请创建好的资源即可。一般情况下,资源提供了统一的接口供使用者调用,到工厂的获取也采用统一的方式,极大地简化了编码,尤其是资源创建比较...
【C++】静态库和链接选项--whole-archive 欢迎大家关注公众号最近在迁移服务到Linux,不少人遇到未定义的符号之类的错误无所适从。简单的情况不做介绍,比如库路径不对等,最近几篇文章主要介绍库依赖相关的情况。预备知识静态库静态库实际上是二进制目标文件的集合。生成目标文件,需要用到-c选项;打包静态库用到ar命令。$g++-ca.cpp$arrcsliba.aa.o第一条命令生成a.o目标文件。第二条将a.o打包进liba.a...
【C++】弱类型的C++ (点击上方公众号,可快速关注)C++是强类型语言吗?在很多人眼里至少它不算弱类型语言,因为它在C语言的基础上类型增强了很多,如,nullptr_t类型区分整型的NULL、enum class 增强了作用域等。但由于兼容C语言,所以语言的某些部分永远“强”不起来,所以,一定要记住:C++是弱类型语言。强类型语言在编译时能给予程序更多的安全保证,所以经常有人说,程序编译通过了基本就没bug了,C++则...
【C++】引用重新赋值? (点击上方公众号,可快速关注)前段时间解决了一个关于引用的bug,原因是引用“重新赋值”造成的,原来的代码逻辑关于队列的选择,为了凸显问题,这里使用一个简单的例子重写。示例代码如下:inta=1;intb=2;//默认取aint&c=a;//若满足某种条件,取bc=b;从代码注释可以看出来,这段代码希望实现的效果是:引用c可以根据条件选择指向的变量。...
工具推荐二 (点击上方公众号,可快速关注)GUI框架我是个后端程序员,使用GUI框架的机会很少,主要用来编写个人或工作中的一些小工具上,经验有限,仅供参考。Tk框架这个框架tcl语言自带,在python里由pytk包提供。Python默认的IDLE编辑器的界面就是pytk编写的。它功能简单,性能也一般,相对应地学起来也简单,适合一些小的个人项目。Java系框架早期的awt已淘汰,swing未来堪忧,即使更现代...
工具推荐其一 (点击上方公众号,可快速关注)工欲善其事,必先利其器。总结一下这些年用得一些比较顺手的工具,纯主关看法,希望对大家有所帮助。编程语言因为工作和兴趣爱好,用过很多编程语言,包括C/C++、Java、C#、Python、JavaScript、汇编、SQL、Go、Rust、Lua、Lisp、Prolog、Haskell、Idris、Scheme、Bash、HTML等,每种语言都有其特点,这里简单介绍它们...
【C++】浅谈C++中的错误处理【改】 (点击上方公众号,可快速关注)完备的错误处理是健壮的程序必不可少的。在C++中,错误处理主要通过两种形式:函数返回值简单起见,C中的errno也归为这一类。异常处理机制,try…catch函数返回值函数通过返回值告诉调用者具体的错误,简单明了,在C/C++中被广泛使用。基本的使用方式不再赘述,仅讨论常见问题的解决方式。嵌套深如下面的伪代码:if(func1()==Sucess){.....
【C++】小而快的Ninja (点击上方公众号,可快速关注)CMake是C++事实上的标准构建生成器(Build generator),之所以叫生成器,是因为它通过分析CMakeLists.txt为构建系统生成真正的构建文件,如Makefile、VS的sln文件等。大部分上下文中,构建生成器跟构建系统指的是一回事。CMake虽应用广泛,但难用程度和语法的迷惑程度远高于类Python语法的Meson,有兴趣的朋友的可以看下(ht...
【C++】浅谈C++中的错误处理 (点击上方公众号,可快速关注)完备的错误处理是健壮的程序必不可少的。在C++中,错误处理主要通过两种形式:函数返回值简单起见,C中的errno也归为这一类。异常处理机制,try…catch函数返回值函数通过返回值告诉调用者具体的错误,简单明了,在C/C++中被广泛使用。基本的使用方式不再赘述,仅讨论常见问题的解决方式。嵌套深如下面的伪代码:if(func1()==Sucess){.....
【算法】三层嵌套循环的时间复杂度 (点击上方公众号,可快速关注)问题在中国大学MOOC听北京大学的《算法初步》课程,第一章有道课后习题比较典型,是关于三层循环的时间复杂度的评估。问题是这样的:解法一作为选择题,最直接的方法就是通过代入法验证结果对不对。当n=4,此时c只能是3,b只能是2,a只能为1,所以语句执行次数为1。将n=4带入上A、B、C三个选项,看看哪一个等于1,这道题比较直接,代入n=4的情况就能得到答案C。否则,就多...
【C++】为什么floor函数返回浮点数 (点击上方公众号,可快速关注)进入话题前先闲扯几句,聊一下今年的就业形势。最近出来两则新闻:1)一北航22届的朋友,拿跟去年几乎同样的简历找工作,去年收到了拿到了网易、快手、美团、百度、蔚来、B站的Offer,结果今年百度通过简历筛选,蔚来还在评估,快手和网易简历直接挂,阿里直接简历挂(去年是挂在hr面);2)毕业生企业就业率呈下降趋势,“985”毕业生涌入县城。感同身受,从20年疫情以来,就业行...
新人常有的一些不好习惯 (点击上方公众号,可快速关注)首先说明下,这里说的”新人“仅仅是我接触到的刚参加工作的新同事。肯定存在不少刚毕业的”老手“,比工作上的”老人“还老道。C++相关不好的习惯include 冗余头文件关于这一点,带来的主要副作用是给使用者增加了依赖,举个例子:假设一个http库提供了Get、Post等功能,大体这样子:#pragmaonce#include<string>#inc...
【现代C++】类型推导与auto (点击上方公众号,可快速关注)类型推导(Type inference 或 Type deduction),顾名思义就是编译器能自动推导出数据类型,免去了显式的类型声明。Java、C#等静态...
【C++】巨坑-VC++的localtime_s的三宗罪 (点击上方公众号,可快速关注)前几天在运行一段代码的时候,发现localtime执行失败,由于代码没有判断返回值,后续对空指针操作导致段错误。所以,需要对该段代码增加保护判断,避免程序崩溃...
【现代C++】自定义字面量-序:字面量(一) (点击上方公众号,可快速关注)C++11引入了自定义字面量,由于这个语言特性的外延较大,为了系统介绍它,先把字面量的知识补全。在看语言规范的过程中,的确发现了好多知识点是以前没接触过的,这...
【C++】再谈 STL reserve的坑 (点击上方公众号,可快速关注)前言之前写过一篇文章《STL reserve函数使用误区》,主要内容是说明一些标准模板类,比如,std::vector、std::string等,提供的res...
【现代C++】新的字符串格式化方法 (点击上方公众号,可快速关注)本篇文章主要介绍现代C++字符串格式化的方法。在此之前,回顾了一些老的字符串格式化的方法,并分析各自的优劣。在最后给出了一种提供给老编译器的折中方案,因为新的...
【现代C++】简洁的as_cast函数模板 (点击上方公众号,可快速关注)前言C++17标准库加入了as_const函数模板,它可以将给定的左值引用转为常量左值引用,用法也很简单。下面的例子中,假设myValue是MyType类型的...