实习笔记(八)——移植代码到linux

把代码从window移植到linux,才知道有不少的区别是要注意的,线程和socket方面都有不同,函数的库及定义也会有一点点不同,下面结合网上找的资料,总结一下要注意的区别:

 

     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()函数替换;而_strnicmp函数,在 Linux 的标准 C 库里面没有这个函数,用 strncasecmp 替换就可以了。

 

     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._mkdir,同样,Linux 下的 C 库也没有这个函数,需要使用 mkdir。需要用到头文件 <sys/stat.h>,而且还要设置权限,跟 Windows 平台下不大一样。详细的使用说明,可以参考 GNU C Library 手册创建目录部分的内容。

 

 

参考:http://blog.chinaunix.net/u1/42517/showart_447683.html 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值