当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 几个 Windows 到 Linux 的代码移植问题

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 114 ::
收藏到网摘: n/a

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

编译:Northtibet


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] = ''\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#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] = ''\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 );}