c++ 边学边用

本文档汇总了C++编程过程中遇到的各种问题及解决方法,包括链接错误、找不到头文件、explicit关键字、成员函数模板、迭代器使用、减少对象拷贝、动态链接库定位、patch应用、STL排序错误、迭代器距离计算、进程ID获取、执行系统命令、类型别名、typeid与sizeof等知识点,旨在帮助C++开发者快速解决问题。
摘要由CSDN通过智能技术生成

作为一个java程序员 转过来作c++,还是要有一段阵痛期的,以下是我个人c++成长路上 遇到的各种问题的收集(有时候太懒,有些问题没有收集进来,后悔)


1. undefined reference to 'xxx'

原因
     编译过了,但是link时没有找到目标文件(.o,.so,.a等)
解决
    在编译中要加 -lxxx参数
    e.x:gcc thread.c -o thread -lpthread

2. 在linux环境下 开发c++程序,编译时提示找不到process.h

原因:

C++标准头文件中没有process.h,process.h是微软写的

解决:

换成:#include <pthread.h>


3.explicit关键字的作用

explicit主要用于防止隐式转换,用于修饰构造函数、复制构造函数。

c++默认是允许隐式转换的,这样灵活啊,但同时就容易引起问题,详细例子:

http://www.programlife.net/cpp-explicit-keyword.html


4.成员函数模板

有关成员函数模板的一个应用在智能指针的例子,对于理解智能指针的实现很有帮助。

http://www.programlife.net/member-function-templates.html


5.迭代字符串时谨慎使用string::size_type

迭代字符串时谨慎使用string::size_type,应该使用迭代器,这涉及到unsigned int类型越界的问题,具体原因看

http://www.programlife.net/be-careful-when-use-stringsize_type.html


6.方法返回时,减少copy对象的办法

如果一个方法返回一个对象,正常会导致一次构造函数,一次copy构造函数以及一次析构函数的开销,但可以进行优化到只发生一次构造函数,具体做法:

T doSomeThing()

{

     T t(123);

     return t;

}

改为

T doSomeThing()

{

      return T(123);

}

7.找不到动态链接库的解决方法

现象举例:“./test: symbol lookup error: ./test: undefined symbol: ……”

原因:

程序使用的动态库存放的位置和Makefile里编译的动态库存位置不同。

解决:

1)ldd来查看动态链接库的定位情况:

ldd xxx

2)修改/etc/ld.so.conf,把你需要的动态链接库的搜索路径加进去

3)执行 ldconfig 命令 刷新 系统的共享库缓存,即 /etc/ld.so.cache  文件


 

知识点:

1、 如果使用 ldd 命令时没有找到对应的共享库文件和其具体位置,可能是两种情况引起的:

  1. 共享库没有安装在该系统中;
  2. 共享库保存在 /etc/ld.so.conf 文件列出的搜索路径之外的位置。

通常情况下,许多开放源代码的程序或函数库都会默认将自己安装到 /usr/loca l 目录下的相应位置(如:/usr/local/bin 或 /usr/local/lib),以便与系统自身的程序或函数库相区别。而许多 Linux 系统的 /etc/ld.so.conf 文件中默认又不包含 /usr/local/lib。因此,往往会出现已经安装了共享库,但是却无法找到共享库的情况。具体解决办法如下:

检查 /etc/ld.so.conf  文件,如果其中缺少 /usr/local/lib  目录,就添加进去;注意: 在修改了/etc/ld.so.conf  文件或者在系统中安装了新的函数库之后,需要运行一个命令:ldconfig , 该命令用来刷新系统的共享库缓存,即 /etc/ld.so.cache  文件。为了减少共享库系统的库搜索时间,共享库系统维护了一个共享库 so 名称的缓存文件/etc/ld.so.cache。因此,在安装新的共享库之后,一定要运行 ldconfig 刷新该缓存。

2、 使用nm命令也可以获取库函数的信息;nm命令可以列出一个函数库文件中的符号表,它对静态的库函数和共享的库函数都能起作用。

8.如何打patch ^_^

svn diff > aaa.patch

patch –Np0 < ../aaa.patch

patch -Rp0< ../aaa.patch


9. 调用STL的sort方法时 出现了:[error]: no match for 'operator -','operator +'

原因:

STL sort方法需要接收RandomAccessIterator类型的迭代器,而如果待排序的容器没有提供随机访问迭代器,那么就会出现此错误。比如list。

知识点:

迭代器类型 http://www.cplusplus.com/reference/iterator/


10.计算两个迭代器之间距离的方法

 

std:: distance

此外 vector<T>::iterator是可以 实现 +n ,-n操作的,其他STL容器的iterator不行。


11. 怎样取得进程识别码

getpid

c函数,取得进程识别码

12.setw与setfill

在C++中,setw(int n)用来控制输出间隔。
例如:
cout<<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值