C++需要注意的地方

  • 01 临时变量(对象)不能作为非const引用

就拿f(a + b)来说,a+b的值会存在一个临时变量中,当把这个临时变量传给f时,由于f的声明中,参数是int&,不是常量引用,因为c++编译器的一个关于语义的限制。如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制。
临时变量不能作为非const引用 - 朱小勇 - 博客园

  • 02 结构体memset为0

当结构体中有vector等类型变量时,谨慎将结构体memset为0,最好用构造函数初始化或手动初始化每个变量,因为一个vector对象包含很多东西,若都初始化为0,可能会产生意想不到的bug(例如调用::resize(0)、::release()等方法时提示“vector iterators incompatible”,即向量与迭代器不兼容。

迭代器报“vector iterators incompatible”错的几种可能_yxnyxnyxnyxnyxn的专栏-CSDN博客

  • 03 动态库内存异常

由于vs版本与库版本兼容的原因,导致变量的内存在库中申请,由主程序尝试析构时失败。

解决:匹配版本;内存由主程序申请。

  • 04 程序报一些缺少"," "("在xxx前面

解决:检查是否有警告C4819,若有将文件改为UTF8-bom格式。

  • 05 防止头文件被重复包含、extern、变量定义与声明的区别

extern关键字对函数来说是多余的,可选的
防止头文件被重复包含、extern、变量定义与声明的区别_秋刀鱼之味的博客-CSDN博客_头文件包含extern变量的声明

  • 06 float与double

两者的精度与范围。

float与double的范围和精度_double范围_=TD=的博客-CSDN博客

double强转成float 在不同的平台上可能有不同的实现,但可以确定的一点是,float一定能保证6位有效数字,后面的有效数字能否保证不确定。在要求有效数字多的场合一定要注意这一点。

  • 07 转换构造函数与类型转换函数

转换构造函数:从其它类型转换到本类型。若对于类A具有单参数或者去掉默认参数后参数数量为1的构造函数,会提供与之对应的转换构造函数。如 B b; A = b,调用A的形参类型为B的转换构造函数来构造B。ref: 关键字explict,此时要注意显式转换。

类型转换函数:从本类型转换到其它类型,是类的成员函数。对于类B,其声明形式为 operator A()(arg...);   将B类型转换为A类型,该函数返回值类型为A。

注意区别A = b; A(b); (A)b;

  • 08 静态库与动态库的附加说明

关于什么是静态库/动态库以及如何生成与使用这里不介绍。

这里需要解释的是动态库与静态库之间的相互依赖问题。现在需要生成 库a,而库a依赖 库b,讨论下面四种情况下各自都需要满足什么条件才能成功生成库a。

A: 静态库 a 依赖静态库 b;

B: 静态库 a 依赖动态库 b;

C: 动态库 a 依赖静态库 b;

D: 动态库 a 依赖动态库 b。

在回答这个问题之前,先理清一个基本逻辑:静态库是编译的产物,动态库是链接的产物。也就是说,动态库实际上可以理解为一个没有主函数入口不可运行的可执行程序,当生成一个动态库时相当于在生成一个可执行程序,需要告知所有函数的入口点(地址)。

linux系统中,对于.a .so来说,函数的所有链接符号都已经包含在该库文件中,所以 ABCD 四种情况下只需在生成库a时链接库b即可。

windows系统中。动态库实际上是由.lib和.dll两个文件所共同描述的,.lib包含了函数符号的入口点等信息,提供给调用者去链接,而.dll则是具体的实现。静态库则仅由.lib描述,.lib包含了函数的所有链接符号和实现。

对于A,由于目标是生成静态库a,不关心链接问题(静态库是编译的产物),因此不需要b即可生成成功。

对于B,由于目标是生成静态库a,不关心链接问题(静态库是编译的产物),因此不需要b的.lib也不需要.dll就可以生成成功。但是,当生成a后,若要仅依赖a进一步生成可执行程序c或动态库c,则生成c时需要链接b的.lib文件。

对于C,由于目标是生成动态库a,涉及链接问题(动态库是链接的产物,因此需要链接b的.lib文件才能生成成功。

对于D,由于目标是生成动态库a,涉及链接问题,因此需要链接b的.lib文件才能生成成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值