中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
【一些GCC版本中存在的BUG及解决办法】
作者:未知 时间:2005-09-13 19:20 出处:ChinaUnix.net 责编:chinaitpower
              摘要:【一些GCC版本中存在的BUG及解决办法】

1、宏FD_ZERO 在libc-5.4.46版本中存在错误。
示例代码如下:
[code:1:5a2b7a82f8]
# define __FD_ZERO(fdsetp) 
    do { 
      int __d0, __d1; 
    __asm__ __volatile__ ("cld; rep; stosl" 
                          : "=m" (((__fd_mask *) 
                                   (fdsetp))[__FDELT (__FD_SETSIZE)]), 
                            "=&c" (__d0), "=&D" (__d1) 
                          : "a" (0), "1" (sizeof (__fd_set) 
                                          / sizeof (__fd_mask)), 
                            "2" ((__fd_mask *) (fdsetp)) 
                          : "memory"); 
    } while (0)
[/code:1:5a2b7a82f8]

解决办法为:替换为glibc 2.0版本。

2、不能用stdin初始化一个静态变量。
示例代码如下:
[code:1:5a2b7a82f8]
#include <stdio.h>

  FILE *fp = stdin;
[/code:1:5a2b7a82f8]

解决办法:由于stdin不是一个常量,因此出错,在libc6以后的版本中,允许这样的使用方式,同时建议在main的开始处初始化。

3、#if使用存在bug。
示例代码如下:
[code:1:5a2b7a82f8]
  memcpy(dest, src,
#ifdef PLATFORM1
         12
#else
         24
#endif
        );
[/code:1:5a2b7a82f8]

解决办法:由于gcc预编译器不允许把#ifdef放在一个宏的参数中,所以出错,解决这个问题是,要么使用新版本的库,要么更改程序如下:
[code:1:5a2b7a82f8]
#ifdef PLATFORM1
   memcpy(dest, src, 12);
#else
   memcpy(dest, src, 24);
#endif
[/code:1:5a2b7a82f8]

4、浮点类型计算存在bug。
示例代码如下:
[code:1:5a2b7a82f8]
#include <iostream>

main() {

 double min = 0.0;
 double max = 0.5;
 double width = 0.01;
 cout <<  (int)(((max - min) / width) - 1) << endl;

}
[/code:1:5a2b7a82f8]

解决办法:在不同的系统中,上面的代码执行结果不一样。如果在编译的时候加上优化级别-O2,编译器在编译期分析最大值和最小值,并且给出一个结果;如果不加优化级别,在这个结果在运行期获得。优化级别的加入可能会改变赋值顺序。事实上,着不算是一个bug,而是float和double故有的局限。因为x87 FPU
的计算精度总比标准C的要高一些。

解决的办法是在编译的时候加上选项:-ffloat-store
这样强迫存储在主存重的浮点数比FPU中的精确。

 衍水狂客 回复于:2004-02-20 17:54:09
我收藏了!

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有