[C陷阱和缺陷] 第7章 可移植性缺陷

  C语言在许多不同的系统平台上都有实现。的确,使用C语言编写程序的一个首要原因就是,C程序能够方便地在不同的编程环境中移植。
  不同的系统有不同的需求,因此我们应该能够预料到,机器不同则其上的C语言实现也由细微差别。今天,一个C程序员如果希望自己写的程序在另一个编程环境也能够工作,他就必须掌握许多这类细小的差别。本章要讨论的是关于可移植性的几个最常见的错误来源,重点放在语言的属性上,而不是在函数库的属性上。
 

7.1 标识符名称的限制

  某些C语言实现把一个标识符中出现的所有字符都作为有效字符处理,而另一些C实现却会自动地截断一个长标识符名称的尾部。连接器也会对它们能够处理的名称强加限制,例如外部名称中只允许使用大写字母。C实现者在面对这样的限制时,一个合理的选择就是强制所有的外部名称必须是大写。
  因为这个原因,为了保证程序的可移植性,谨慎地选择外部标识符的名称是重要的。比如说,两个函数的名称分别为 printf_fields 与 printf_float,这样的命名方式就不恰当;同理,使用 State 与 STATE 这样的命名方式也不明智。
  下面这个例子多少有些让人吃惊,考虑以下函数:

    char    *Malloc(unisgned n)
    {
        char    *p, *malloc(unsigned);

        p = malloc(n);
        if (p == NULL)
        {
            printf("out of memory");
            exit(-1);
        }
        return p;      
    }

  上面的例子程序演示了一个确保检测到内存耗尽的异常情况的简单办法:在程序中应该调用 malloc 函数分配内存的地方,改为调用 Malloc 函数。这样,客户程序就不必在每次调用 malloc 函数
  在一个不区分外部名称大小写的C语言中调用函数 Malloc, 与 malloc 实际上是等同的,也就是说,库函数 malloc 将被 Malloc 函数等效替换。

猜你喜欢

转载自www.cnblogs.com/linuxAndMcu/p/10087796.html