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

大海黑夜

大海黑夜

2016-01-29 12:26

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

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

编译:Northtibet

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)


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

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

long GetTickCount(){    tms tm;    return times(&tm);}

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

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

#if defined(__linux__)#define _itoa   itoachar* itoa(int value, char*  str, int radix){    int  rem = 0;    int  pos = 0;    char ch  = ''!'' ;    do    {        rem    = value % radix ;        value /= radix;        if ( 16 == radix )        {            if( rem >= 10 && rem <= 15 )            {                switch( rem )                {                    case 10:                        ch = ''a'' ;                        break;                    case 11:                        ch =''b'' ;                        break;                    case 12:                        ch = ''c'' ;                        break;                    case 13:                        ch =''d'' ;                        break;                    case 14:                        ch = ''e'' ;                        break;                    case 15:                        ch =''f'' ;                        break;                }            }        }        if( ''!'' == ch )        {            str[pos++] = (char) ( rem + 0x30 );        }        else        {            str[pos++] = ch ;        }    }while( value != 0 );    str[pos] = '''' ;    return strrev(str);}#endif
3、Windows 到 Linux 关于 __strrev 的移植问题

  因为在 Linux 系统中没有 __strrev 函数,那么将 Windows 代码移植到 Linux 系统时会有问题,本文下面描述一个技巧,在 Linux 中提供一个替代 __strrev 函数的方法。这里提供两个单独的实现:一个是普通的 char* C 函数使用的 __strrev 标准实现,另一个是针对 STL 的实现。两者的输入和输出仍然都是 char*。
//// strrev 标准版//#if !defined(__linux__)#define __strrev strrev#endifchar* strrev(char* szT){    if ( !szT )                 // 处理传入的空串.        return "";    int i = strlen(szT);    int t = !(i%2)? 1 : 0;      // 检查串长度.    for(int j = i-1 , k = 0 ; j > (i/2 -t) ; j-- )    {        char ch  = szT[j];        szT[j]   = szT[k];        szT[k++] = ch;    }    return szT;}//// strrev 针对 STL 的版本.//char* strrev(char* szT){    string s(szT);    reverse(s.begin(), s.end());    strncpy(szT, s.c_str(), s.size());    szT[s.size()+1] = '''';    return szT;
4、实现 Sleep 函数从 Windows 到 Linux 的移植

  假设你有一些在 Windows 环境编写的代码,你想让它们在 Linux 环境下运行,条件是要保持对原有 API署名的调用。比如在 Windows 中有 Sleep,而在 Linux 中对应的函数是 usleep,那么如何保持原有的函数名称调用呢?下面给出一段代码例子:
void Sleep(unsigned int useconds ){    // 1 毫秒(milisecond) = 1000 微秒 (microsecond).    // Windows 的 Sleep 使用毫秒(miliseconds)    // Linux 的 usleep 使用微秒(microsecond)    // 由于原来的代码是在 Windows 中使用的,所以参数要有一个毫秒到微秒的转换。    usleep( useconds * 1000 );}

展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
几个 Windows 到 Linux 的代码移植问题

将Linux代码移植到Windows的简单方法

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
将Linux代码移植到Windows的简单方法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

移植到.NET

电脑网络
移植到.NET

XP升级到Windows7必须想清楚几个问题

电脑入门
XP升级到Windows7必须想清楚几个问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Windows 2003和Redhat Linux7.3安装问题

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Windows 2003和Redhat Linux7.3安装问题

把ASP移植到ASP+

ASP
把ASP移植到ASP+

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VC+6.0实现文本串的自由拆分

VC+6.0实现文本串的自由拆分

Flash鼠绘新手入门教程:花草的绘制方法

Flash鼠绘新手入门教程:花草的绘制方法
下拉加载更多内容 ↓