Windows 到 Linux 代码移植的常见问题

原创 2007年09月29日 11:22:00

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   itoa

char* 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] = ''/0'' ;
    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
#endif

char* 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] = ''/0'';
    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 );
}


5.在win下map的erase函数有返回值,而linux下的map的erase函数没返回值,
能用:
win下的语句
QPeerIdMap :: iterator pmi;
        for( pmi = m_mpAvailPeers.begin(); pmi != m_mpAvailPeers.end(); )
        {
                    。。。。。。。
                     pmi = m_mpAvailPeers.erase( pmi );
        }

linux能用
QPeerIdMap :: iterator pmi,pmi1;
        for( pmi = m_mpAvailPeers.begin(); pmi != m_mpAvailPeers.end(); )
        {
                       ........................
                       pmi1 = pmi;
                       pmi1++;
                     m_mpAvailPeers.erase( pmi );
                       pmi = pmi1;
        } 

相关文章推荐

VC6代码移植到高版本VC时候的常见问题

最近把一个VC6工程移植到高版本VC时候,总结的一些代码需要修改的地方:   1、循环体变量的作用域的差异   VC6可以这样写,循环变量在循环体外面一样有效: for(int i=0; i...

移植Linux内核到mini2440常见问题

具体方法参考移植手册,常见问题如下。 错误一: NOW, Booting Linux...... Uncompressing Linux................................

移植linux内核到mini2440常见问题

具体方法参考移植手册,常见问题如下。错误一:NOW, Booting Linux......Uncompressing Linux......................................
  • icyrat
  • icyrat
  • 2011年03月25日 22:06
  • 3057

Linux系统网卡配置详解以及—常见问题的解决方法以及—硬盘移植后网卡的配置

前言:最近给好多机器配置了网卡,因为配的多所以遇到的问题也多 本文就做个总结 本文讲的不是具体问题的解决方法,而是给你一个思路,知道问题出在哪里,掌握了这些规则后,能够自如的解决任何与网卡配置有关...

linux系统移植时候存在的常见问题

今天用主线Linux内核移植到MINI6410,主线内核2.6.37.1基本已经支持了MINI6410的板子,所以移植到能够启动起来的阶段很简单,但是在移植的时候还是出现了一个比较常见的问题: ...

zookeeper的配置(Windows环境和Linux环境下)常见问题(zookeeper_server.pid: No such file or directory)解决

Zookeeper作为一款优秀的注册中心,其安装和配置都十分简单,单机模式、集群模式配置方便,而且其安装包windows和linux下通用,下载地址如下: http://zookeeper.apac...

eclipse for java ee的tomcat配置(常见问题解决)(linux或windows兼可)

前一段时间准备学习ssh的源码,但是web开发的环境一直没有弄好,myeclipse又是注册又是破解什么的好麻烦,而且占地方又大,于是瞄上了官方的ecplise的j2ee版本。 但是手里的学习视...

Windows系统用户转Linux新手常见问题整理

经常在论坛里看到一些新手(当然我自己也还是新手)的提问,这些问题在以前的帖子里面都见到过,有的问题我在作答的时候还能想起自己曾经回答过这个问题。这些可能是很多新手都要经历的,所以想写一个常见问题整理放...
  • sscrazy
  • sscrazy
  • 2012年01月10日 16:02
  • 214

(GPS移植三部曲)Linux下移植GPS应用程序之常见问题的分析与解决方法之二

Linux下移植GPS应用程序之常见问题的分析与解决方法之一 OS:Linux 一. 直接提供函数实现给第三方 原因:主芯片设计以及gps芯片的更改,导致gps驱动程序时常处于更新状态 演化为...

HP-UX移植常见问题

  • 2010年01月07日 11:52
  • 287KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows 到 Linux 代码移植的常见问题
举报原因:
原因补充:

(最多只允许输入30个字)