几个 Windows 到 Linux 的代码移植问题

1、在 Linux 实现 Win32 API 之 GetTickCount 函数

为了将 Windows 中的  GetTickCount API 函数移植到 Linux,可以使用如下的代码:

1. long GetTickCount()
2. {
3. tms tm;
4. return times(&tm);
5. }

2、Windows 和 Linux 系统关于 itoa 的移植问题

大家知道,在将 Windows 的 STL 代码移植到 Linux 系统时,由于 Linux 系统中 STL 没有实现默认的 itoa 函数,因此 itoa 在 Linux 中无法正常工作。要是在 GCC 命令行禁用 STL 的话,那么代码里就无法使用 STL,从而丢失可移植性。这里给出一个 简单可行的解决方法,以便你碰到这种情况时顺利进行从 Windows 到 Linux 的移植:

01. #if defined(__linux__)
02.  
03. #define _itoa   itoa
04.  
05. char* itoa(int value, char*  str, int radix)
06. {
07. int  rem = 0;
08. int  pos = 0;
09. char ch  = ''!'' ;
10. do
11. {
12. rem    = value % radix ;
13. value /= radix;
14. if ( 16 == radix )
15. {
16. if( rem >= 10 && rem <= 15 )
17. {
18. switch( rem )
19. {
20. case 10:
21. ch = ''a'' ;
22. break;
23. case 11:
24. ch =''b'' ;
25. break;
26. case 12:
27. ch = ''c'' ;
28. break;
29. case 13:
30. ch =''d'' ;
31. break;
32. case 14:
33. ch = ''e'' ;
34. break;
35. case 15:
36. ch =''f'' ;
37. break;
38. }
39. }
40. }
41. if''!'' == ch )
42. {
43. str[pos++] = (char) ( rem + 0x30 );
44. }
45. else
46. {
47. str[pos++] = ch ;
48. }
49. }while( value != 0 );
50. str[pos] = ''\0'' ;
51. return strrev(str);
52. }
53.  
54. #endif

3、Windows 到 Linux 关于 __strrev 的移植问题

因为在 Linux 系统中没有 __strrev 函数,那么将 Windows 代码移植到 Linux 系统时会有问题,本文下面描述一个技巧,在 Linux 中提供一个替代 __strrev 函数的方法。这里提供两个单独的实现:一个是普通的 char* C 函数使用的 __strrev 标准实现,另一个是针对 STL 的实现。两者的输入和输出仍然都是 char*。

01. //
02. // strrev 标准版
03. //
04.  
05. #if !defined(__linux__)
06. #define __strrev strrev
07. #endif
08.  
09. char* strrev(char* szT)
10. {
11. if ( !szT )                 // 处理传入的空串.
12. return "";
13. int i = strlen(szT);
14. int t = !(i%2)? 1 : 0;      // 检查串长度.
15. for(int j = i-1 , k = 0 ; j > (i/2 -t) ; j-- )
16. {
17. char ch  = szT[j];
18. szT[j]   = szT[k];
19. szT[k++] = ch;
20. }
21. return szT;
22. }
23.  
24. //
25. // strrev 针对 STL 的版本.
26. //
27.  
28. char* strrev(char* szT)
29. {
30. string s(szT);
31. reverse(s.begin(), s.end());
32. strncpy(szT, s.c_str(), s.size());
33. szT[s.size()+1] = ''\0'';
34. return szT;

4、实现 Sleep 函数从 Windows 到 Linux 的移植

假设你有一些在 Windows 环境编写的代码,你想让它们在 Linux 环境下运行,条件是要保持对原有 API署名的调用。比如在 Windows 中有 Sleep,而在 Linux 中对应的函数是 usleep,那么如何保持原有的函数名称调用呢?下面给出一段代码例子:

1. void Sleep(unsigned int useconds )
2. {
3. // 1 毫秒(milisecond) = 1000 微秒 (microsecond).
4. // Windows 的 Sleep 使用毫秒(miliseconds)
5. // Linux 的 usleep 使用微秒(microsecond)
6. // 由于原来的代码是在 Windows 中使用的,所以参数要有一个毫秒到微秒的转换。
7. usleep( useconds * 1000 );
8. }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值