与大家谈谈如何写可移植的程序

这是自己四年前写的一篇文章,觉得还有点用,现在拿出来给大家分享:

 

 

1) 写程序请一定要考虑到你今后可能换个编译器。所以请使用预定义宏!比如MS的编译器就事先定义了__MSC,而Borland的就预先定义了__BORLAND_C。Sunplus GCC编译器也肯定有这样的宏。举个例子:setvect函数在Borland的实现中就叫setvect,而MS C/C++中却是_dos_setvet。如果你仅仅是简单的用setvect,那你的程序就很可能失去了移植到MS C下的可能。不过如果你这么写:

 

#if  defined(  __MSC  )

 

    _dos_setvect( 0x09,  pgos_timer_handler ) ;

 

#else

 

#if  defined( __BORLAND_C  )

 

    setvect( 0x09,  pgos_timer_handler ) ;

 

#endif

 

#error Error ! Need MSC or Borland C to compile this programe !

 

#endif

 

上面的代码就有很好的可移植性。并且可以在MS和BORLAND的编译器下都正确的工作,并且还能检测出如果的你编译器不是这两种的话,还能给个错误信息并终止编译。这个程序的可移植性很好。

 

2) 内存对齐与字节序。大多数的不可移植问题似乎都来自内存对齐,所以要避免写出需要内存对齐的或者对字节序有特殊要求的程序。

 

3) 使用标准的C语言。给大家再介绍一个预定义宏,可以用来检测你的C语言编译器是不是一个标准C编译器:

 

#if  defined( __STDC__ )

 

// This is a standerd ANSI C compiler

 

#else

 

// This is not a standerd C compiler, perhaps K&R C ???

 

#endif

 

3) 永远不要使用位域(bit fields)。虽然C支持在结构内申明位,比如:

 

int ch : 1 ;

 

但那往往带来的后果就是你的代码成了architecture specific code。也就是说,完全丧失了可移植性。

 

4) 不要直接使用int。int是魔鬼!在16位系统上,sizeof(int)是2,在32位系统上,却是4。一些依赖于int长度的程序将无法移植,我建议写下面的宏:

 

#if defined( CPU16 )

 

typedef  int SWORD ;

 

typedef unsigned int UWORD ;

 

#else

 

...

 

...

 

#endif

 

如果觉得这样麻烦,那就用short,它在十六位和三十二位系统上都是2个字节长。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值