1、在Linux实现Win32 API之GetTickCount函数
为了将Windows中的GetTickCount API函数移植到Linux,可以使用如下的代码:
- longGetTickCount()
- {
- tmstm;
- returntimes(&tm);
- }
2、Windows和Linux系统关于itoa的移植问题
大家知道,在将Windows的STL代码移植到Linux系统时,由于Linux系统中STL没有实现默认的itoa函数,因此itoa在Linux中无法正常工作。要是在GCC命令行禁用STL的话,那么代码里就无法使用STL,从而丢失可移植性。这里给出一个简单可行的解决方法,以便你碰到这种情况时顺利进行从Windows到Linux的移植:
- #ifdefined(__linux__)
- #define_itoaitoa
- char*itoa(intvalue,char*str,intradix)
- {
- intrem=0;
- intpos=0;
- charch=''!'';
- do
- {
- rem=value%radix;
- value/=radix;
- if(16==radix)
- {
- if(rem>=10&&rem<=15)
- {
- switch(rem)
- {
- case10:
- ch=''a'';
- break;
- case11:
- ch=''b'';
- break;
- case12:
- ch=''c'';
- break;
- case13:
- ch=''d'';
- break;
- case14:
- ch=''e'';
- break;
- case15:
- ch=''f'';
- break;
- }
- }
- }
- if(''!''==ch)
- {
- str[pos++]=(char)(rem+0x30);
- }
- else
- {
- str[pos++]=ch;
- }
- }while(value!=0);
- str[pos]='''';
- returnstrrev(str);
- }
- #endif
3、Windows到Linux关于__strrev的移植问题
因为在Linux系统中没有__strrev函数,那么将Windows代码移植到Linux系统时会有问题,本文下面描述一个技巧,在Linux中提供一个替代__strrev函数的方法。这里提供两个单独的实现:一个是普通的char* C函数使用的__strrev标准实现,另一个是针对STL的实现。两者的输入和输出仍然都是char*。
- //
- //strrev标准版
- //
- #if!defined(__linux__)
- #define__strrevstrrev
- #endif
- char*strrev(char*szT)
- {
- if(!szT)//处理传入的空串.
- return"";
- inti=strlen(szT);
- intt=!(i%2)?1:0;//检查串长度.
- for(intj=i-1,k=0;j>(i/2-t);j--)
- {
- charch=szT[j];
- szT[j]=szT[k];
- szT[k++]=ch;
- }
- returnszT;
- }
- //
- //strrev针对STL的版本.
- //
- char*strrev(char*szT)
- {
- strings(szT);
- reverse(s.begin(),s.end());
- strncpy(szT,s.c_str(),s.size());
- szT[s.size()+1]='''';
- returnszT;
4、实现Sleep函数从Windows到Linux的移植
假设你有一些在Windows环境编写的代码,你想让它们在Linux环境下运行,条件是要保持对原有API署名的调用。比如在Windows中有Sleep,而在Linux中对应的函数是usleep,那么如何保持原有的函数名称调用呢?下面给出一段代码例子:
- voidSleep(unsignedintuseconds)
- {
- //1毫秒(milisecond)=1000微秒(microsecond).
- //Windows的Sleep使用毫秒(miliseconds)
- //Linux的usleep使用微秒(microsecond)
- //由于原来的代码是在Windows中使用的,所以参数要有一个毫秒到微秒的转换。
- usleep(useconds*1000);
- }