c++跨平台开发经验
2014-04-03 22:57
246 查看
这些是一些自己在开发过程中与移植程序过程中碰到的linux编程与windows编程的差异之处,以及从网上总结了一些解决办法和经验。
1. 文件与目录的大小写以及路径分隔符的差别。
windows下不区分大小写,路径分隔符一般使用"\";linux下区分大小写,路径分隔符使用"/"。
2. itoa()函数在linux下并不存在。
所以使用类似sprintf();之类的函数是个不错的替代。(为什么说是类似函数,看下面一条啦)
3. _snprintf()与_vsnprintf()的差别。
sprintf()不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf()。
例如,要把c2字符产write给c1,比较安全的用法:
如果在write之前主动检查一下c2的长度再申请c1的空间当然是最好的。
4. 在linux下并不存在std::exception(char*),可以使用logic_error类型代替exception。
5. 尽量使用STL与标准C库,并且要按照标准C++语法来写程序。
比如这种用法list< type1<T0> >::iterator iter;在windows下的编译器下没有编译错误;但在linux下,就需要在前面增加typename才能顺利编译通过。
6. 在源文件最后多加一个或几行的空行,以免蹦出警告:"no newline at end of file"。
7. windows中对ini文件进行操作的所有函数在linux下都没有对应函数。
建议自己写一个操作ini文件的类,在STLChina上有一个使用stl制作这种类的原理介绍和一小段代码片段,自己扩充一下。
8. SOCKET对象集要使用fd_set,不要使用FD_SET。
9. stricmp()函数,在linux下用strcasecmp()函数替换。
10. 在linux下不存在INVALID_SOCKET、INVALID_HANDLE_VALUE、SOCKET_ERROR、MAX_PATH、INFINITE、STILL_ACTIVE等宏定义。
11. 参数要求为char*的时候别忘了给传进去的string加一个.c_str()函数。
12. linux下不存在目录操作时要包含的direct.h与io.h头文件,而要包含相应的unistd.h与fcntl.h头文件。
13. filelength()函数在linux也不存在,可以通过fstat()函数来替代。
使用文件与目录操作函数,不要使用类似_access带下划线的函数,取而代之有access函数可以通用。
14. #prgram once预编译指令在linux下并不起作用,请使用以下标准方式来解决头文件多次包含问题:
15. hash_map出现在后期版本的stl库,为兼顾hasp与tree map,请可以通过以下宏来解决:
16. 为了区别不同OS,一般可用的几个宏有:WIN32,__linux__,需要使用与OS相关的内容,请一定用开关来写。
17. 对于界面操作部分代码,一定要把它与程序逻辑核心代码用宏分开来,这样的代码才好移植,不要交错。
18. 不要假定可执行文件一定有如.exe的扩展名。
19. 在父类中用typedef定义的类型,在子类并不能直接使用。
20. long类型的变量在32位和64位Windows上都是4个字节,而在64位Linux系统上占8字节。
1. 文件与目录的大小写以及路径分隔符的差别。
windows下不区分大小写,路径分隔符一般使用"\";linux下区分大小写,路径分隔符使用"/"。
2. itoa()函数在linux下并不存在。
所以使用类似sprintf();之类的函数是个不错的替代。(为什么说是类似函数,看下面一条啦)
3. _snprintf()与_vsnprintf()的差别。
sprintf()不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf()。
int _snprintf( char *buffer, size_t count, const char *format [, argument] ... );
例如,要把c2字符产write给c1,比较安全的用法:
char c1[256]; sa[sizeof(c1)-1] = 0; _snprintf(c1, sizeof(c1), "%s", c2); if(c1[sizeof(c1)-1]!=0) { cout<<"warning: string is truncated")<<endl; c1[sizeof(c1)-1]=0; }
如果在write之前主动检查一下c2的长度再申请c1的空间当然是最好的。
4. 在linux下并不存在std::exception(char*),可以使用logic_error类型代替exception。
5. 尽量使用STL与标准C库,并且要按照标准C++语法来写程序。
比如这种用法list< type1<T0> >::iterator iter;在windows下的编译器下没有编译错误;但在linux下,就需要在前面增加typename才能顺利编译通过。
6. 在源文件最后多加一个或几行的空行,以免蹦出警告:"no newline at end of file"。
7. windows中对ini文件进行操作的所有函数在linux下都没有对应函数。
建议自己写一个操作ini文件的类,在STLChina上有一个使用stl制作这种类的原理介绍和一小段代码片段,自己扩充一下。
8. SOCKET对象集要使用fd_set,不要使用FD_SET。
9. stricmp()函数,在linux下用strcasecmp()函数替换。
10. 在linux下不存在INVALID_SOCKET、INVALID_HANDLE_VALUE、SOCKET_ERROR、MAX_PATH、INFINITE、STILL_ACTIVE等宏定义。
11. 参数要求为char*的时候别忘了给传进去的string加一个.c_str()函数。
12. linux下不存在目录操作时要包含的direct.h与io.h头文件,而要包含相应的unistd.h与fcntl.h头文件。
13. filelength()函数在linux也不存在,可以通过fstat()函数来替代。
使用文件与目录操作函数,不要使用类似_access带下划线的函数,取而代之有access函数可以通用。
14. #prgram once预编译指令在linux下并不起作用,请使用以下标准方式来解决头文件多次包含问题:
#ifndef _XXXXX_H_ #define _XXXXX_H_ #endif
15. hash_map出现在后期版本的stl库,为兼顾hasp与tree map,请可以通过以下宏来解决:
// process hash_map #if defined(_MSC_VER) #if _MSC_VER >= 1300 // hasp_map not standard container #pragma warning(disable: 4996) #include <hash_map> // we believe _STLP_STRING included means using STLPORT #elif defined(_STLP_STRING) #include <hash_map> #else #define hash_map map #endif #endif
16. 为了区别不同OS,一般可用的几个宏有:WIN32,__linux__,需要使用与OS相关的内容,请一定用开关来写。
17. 对于界面操作部分代码,一定要把它与程序逻辑核心代码用宏分开来,这样的代码才好移植,不要交错。
18. 不要假定可执行文件一定有如.exe的扩展名。
19. 在父类中用typedef定义的类型,在子类并不能直接使用。
20. long类型的变量在32位和64位Windows上都是4个字节,而在64位Linux系统上占8字节。
相关文章推荐
- C/C++中各种类型int、long、double、char表示范围(最大最小值)
- Effective C++ 对象管理资源
- 黑马程序员 C语言------预处理指令学习
- BCB(C++ Builder)创建动态库(DLL,接口导出和调用),动态加载DLL
- 第四周作业——无向图的DFS算法【改
- 黑马程序员 C语言------结构体 枚举学习
- 黑马程序员 C语言-----指针学习
- c++ primer阅读笔记-12章-2
- C语言-线性表基本操作之单链表
- Box2D C++ 教程-自定义重力
- 联合体的使用(c++)
- C++前插法实现链表
- VC++动态链接库(DLL)编程深入浅出
- 【每日一C之十一】C语言volatile
- C++构造函数的调用
- C语言指针的初始化和赋值
- C++基础(四)继承
- C++中把BYTE转换为int
- C++的虚析构函数
- 写的很好 链表的各种题目整理(C语言实现)