当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

一些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中的精确。

相关内容
赞助商链接