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.
}