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.
}
ref:http://blog.youkuaiyun.com/yy0_0/article/details/7823940
本文探讨了在Linux环境下实现Windows API函数(如GetTickCount、itoa及strrev)的移植方法,以及如何在Linux中实现Sleep函数的等效替代。文章提供了关键函数的移植代码和实现细节,旨在帮助开发者在不同操作系统间进行代码迁移。

被折叠的 条评论
为什么被折叠?



