作为一个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 命令时没有找到对应的共享库文件和其具体位置,可能是两种情况引起的:
- 共享库没有安装在该系统中;
- 共享库保存在 /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<<