C陷阱与缺陷 第7章 可移植性缺陷 7.1 应对C语言标准变更

发布于:2022-12-25 ⋅ 阅读:(478) ⋅ 点赞:(0)

    可移植性缺陷 
    使用C语言的一个首要原因就是,C程序能够方便在不同的编程环境中移植。
    ANSI C标准的发布能够在一定程度上解决问题,但并不是万应灵药。

    可移植性是一个涵盖范围非常广泛的主题 
    Mark Horton在它的著作How to Write Portable Software in C中详细地讨论了这个主题。 
 

    应对C语言标准变更 
    ANSI C标注允许这样写,但在老的机器上不能运行。 
    double square(double x) {
        return x * x;
    }
    以前旧的形式能在旧的机器上运行。 
    double square(x) double x; { 
        return x * x;
    }
    旧形式的声明: 
    double square();
   省略了参数类型的说明,这在ANSI C标准中也是合法的。因为这样的声明并没有对参数类型做任何说明,这意味着如果在函数调用时传入了错误类型的参数,函数调用就会不声不响地失败。
    double square(); 
    int main() {
        printf("%g\n", square(3));
    }
    参数类型不匹配,程序打印出来的将是一堆“垃圾信息”。 

    //error
    /*
    ** square.c
    */
    #include <stdio.h>
    #include <stdlib.h>
    
    double square();
    
    int main() {
        printf("%g\n", square(3));
    
        return EXIT_SUCCESS;
    }
    
    double square( s ) double s;{
        return s * s;
    }

输出:

    上面的程序改写为这样: 
    double square(double);

    int main() {
        printf("%g\n", square(3));
    }
    3会自动转换为double类型。另一种改写方法是,在这个程序中显式地给函数square传入一个double类型的参数: 
    //correct
    double square();
    
    int main() {
        printf("%g\n", square(3.0));
    }
    
    /*
    ** square_2.c
    */
    #include <stdio.h>
    #include <stdlib.h>
    
    double square();
    
    int main() {
        printf("%g\n", square(3.0));
    
        return EXIT_SUCCESS;
    }
    
    double square( s ) double s;{
        return s * s;
    }

输出:

    程序的生命期往往超过了编程人员最初的预期,即使这个程序只是编程人员出于自用目的而编写的。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到