首页 百科知识 一个名字中都有什么

一个名字中都有什么

时间:2022-09-22 百科知识 版权反馈
【摘要】:一些C编译器将一个标识符中的所有字符视为签名。一个常见的加载器约束是所有的外部名字必须只能是大写的。这种约束在C语言参考手册中第2.1节由所描述。一个标识符是一个字符和数字序列,第一个字符必须是一个字母。如果malloc()不幸失败,将调用panic()来显示一个恰当的错误消息并终止程序。然而,考虑当该函数用于一个忽略大小写区别的系统中时会发生什么。这时,名字malloc和Malloc是等价的。

7 可移植性缺陷

    C被很多人实现并运行在很多机器上。这也正是在一个地方写的C程序应该能够很容易地转移到另一个编程环境中去的原因。

 

    然而,由于有很多的实现者,它们并不和其他人交流。此外,不同的系统有不同的需求,因此一台机器上的C实现和另一台上的多少会有些不同。

 

    由于很多早期的C实现都关系到UNIX操作系统,因此这些函数的性质都是专于该系统的。当一些人开始在其他系统中实现C时,他们尝试使库的行为类似于UNIX系统中的行为。

 

    但他们并不总是能够成功。更有甚者,很多人从UNIX系统的不同版本入手,一些库函数的本质不可避免地发生分歧。今天,一个C程序员如果想写出对于不同环境中的用户都有用的程序就必须知道很多这些细微的差别。

 

7.1 一个名字中都有什么?

    一些C编译器将一个标识符中的所有字符视为签名。而另一些在存储标识符时会忽略一个极限之外的所有字符。C编译器产生的目标程序同将要被加载器进行处理以访问库中的子程序。加载器对于它们能够处理的名字通常应用自己的约束。

 

    一个常见的加载器约束是所有的外部名字必须只能是大写的。面对这样的加载器约束,C实现者会强制要求所有的外部名字都是大写的。这种约束在C语言参考手册中第2.1节由所描述。

 

一个标识符是一个字符和数字序列,第一个字符必须是一个字母。下划线_算作字母。大写字母和小写字母是不同的。只有前八个字符是签名,但可以使用更多的字符。可以被多种汇编器和加载器使用的外部标识符,有着更多的限制:

 

    这里,参考手册中继续给出了一些例子如有些实现要求外部标识符具有单独的大小写格式、或者少于八个字符、或者二者都有。

 

    正因为所有这些,在一个希望可以移植的程序中小心地选择标识符是很重要的。为两个子程序选择print_fieldsprint_float这样的名字不是个好办法。

 

    考虑下面这个显著的函数:

 

char *Malloc(unsigned n) {

    char *p,*malloc();

    p = malloc(n);

    if(p == NULL)

       panic("out of memory");

    return p;

}

 

    这个函数是保证耗尽内存而不会导致没有检测的一个简单的办法。程序员可以通过调用Mallo()来代替malloc()。如果malloc()不幸失败,将调用panic()来显示一个恰当的错误消息并终止程序。

 

    然而,考虑当该函数用于一个忽略大小写区别的系统中时会发生什么。这时,名字mallocMalloc是等价的。换句话说,库函数malloc()被上面的Malloc()函数完全取代了,当调用malloc()时它调用的是它自己。显然,其结果就是第一次尝试分配内存就会陷入一个递归循环并随之发生混乱。但在一些能够区分大小写的实现中这个函数还是可以工作的。

 

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈