为什么C基本类型有多个关键字的标识符

Why do C fundamental types have identifiers with multiple keywords

本文关键字:关键字 标识符 类型 为什么      更新时间:2023-10-16

除了明显的答案,因为,家伙们设计的方式,为什么C/c++有类型,它由多个标识符组成,例如

  • long long (int)
  • short int
  • signed char
我确实有一些解析的基本知识,并使用flex/bison工具制作了一些解析器,我认为这给解析类型名带来了更多的复杂性。从标准的c++语法来看,关于类型的一切都很复杂。

我知道,c++(也是C,我相信)没有详细说明基本数据类型的大小,因此使int_8, uint_8等类型无法工作(尽管c++11给了我们固定宽度的整数)。

那么,为什么标准的开发人员同意多字类型标识符,当他们可以做出int, uint和类似的。

用C语言来说,为什么标准的开发人员同意使用多字标识符?因为在标准化的时候,这就是语言所拥有的。

原始标准的任务不是创建一种新的语言,而是编纂现有的实践。根据C89标准本身:

委员会在审议期间评估了许多关于增加、删除和修改基本文件的建议。在能够确定明确和一致的做法的地方,为编纂现有做法作出了协调一致的努力。但是,在无法确定一贯做法的情况下,委员会努力制定与语言总体风格一致的明确规则。

并且,从C99基本原理文档中:

最初的X3J11章程明确要求编纂共同现有做法,和C89委员会坚持先例,只要这是明确和明确的。C89定义的绝大多数语言与Brian Kernighan和Dennis Ritchie在《C编程语言》第一版附录A中定义的完全相同,并且几乎在当时所有的C翻译器中都实现了。

除此之外,标准的每次迭代都高度重视向后兼容性,以便代码不会中断。从相同的理论文档:

现有的代码是重要的,现有的实现不是。存在大量具有相当商业价值的C代码。每一次尝试都是为了确保大部分代码对于任何符合标准的实现都是可接受的。C89委员会不想强迫大多数程序员修改他们的C程序,只是为了让它们被一个符合标准的翻译器接受。

因此,虽然标准的后期版本给了我们像stdint.h这样的固定宽度整型,但去掉intlong这样的标准类型将严重违反该指导原则。


就c++而言,它几乎肯定是该语言早期的遗留,当时它被提出为"C+类"。事实上,非常早期的cfront c++编译器之所以如此命名,是因为它在将c++源代码交给合适的C编译器(即C的前端,因此cfront)之前,将其转换为C。

这将允许原作者Bjarne最小化交付c++的工作量,因为大部分已经由C编译器自己提供了。


在解析语言方面,处理unsigned long int x (a)当然比处理ulong x要困难得多。

但是,考虑到编译器已经必须为一个变量处理大量可选的"修饰符/说明符"(例如,const char * const x),处理一些其他的是理所当然的。


(a)int long unsigned xlong unsigned x或任何其他类型说明符,最终成为单数unsigned long int 类型

向语言中添加新的保留词将破坏任何恰好使用这些词作为标识符的代码,除非这些词的形式是为将来扩展而保留的(例如包含两个下划线,或者以下划线和大写字母开头,等等)

相反,如果某些特定的保留字序列在任何现有的实现中没有定义的意义,则不可能存在使用该保留字序列的现有代码,因此没有通过附加新含义来破坏现有代码的危险。