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

时间:2016-09-25 10:04:42

标签: c++ c language-lawyer

除了显而易见的答案,因为,伙计们就是这样设计的,为什么C / C ++有类型,包括多个标识符,例如

  • long long (int)
  • short int
  • signed char

有一些解析的基本知识,并且使用flex / bison工具来制作一些解析器,我认为这会给解析类型名称带来更多的复杂性。在标准中查看C ++语法,关于类型的所有内容都非常复杂。

我知道,C ++(我也相信C)没有详细说明基本数据类型的大小,因此类型int_8uint_8等不起作用(Altough c + +11给了我们fixed width integers)。

那么,为什么标准的开发人员同意多字词类型标识符,他们可以制作intuint等类似标识符。

2 个答案:

答案 0 :(得分:5)

就C而言,标准的开发人员为何同意多字标识符?这是因为这是标准化时语言的含义。

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

  

委员会在审议期间评估了许多关于增加,删除和修改基础文件的提案。 在可以确定明确和一致的做法的地方,共同努力编纂现有做法。但是,如果无法确定一致的做法,委员会就会制定明确的规则,使其符合该语言的整体风格。

并且,从C99理由文件:

  

最初的X3J11章程明确规定编纂共同的现有做法,和C89委员会在任何明确和明确的地方举行。 C89定义的绝大多数语言与Brian Kernighan和Dennis Ritchie编写的第一版C语言的附录A中所定义的完全相同,并且在当时几乎所有C语言翻译器中都实现了。

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

  

现有代码很重要,但现有的实现并非如此。大量的C代码存在相当大的商业价值。我们已尽一切努力确保符合标准的任何实现都能接受大部分代码。 C89委员会不想强迫大多数程序员修改他们的C程序,只是为了让他们接受合格的翻译。

因此,虽然该标准的更高版本为我们提供了stdint.h等具有固定宽度整数类型的内容,但删除intlong之类的标准内容将严重违反该指南。

就C ++而言,它几乎可以肯定是从该语言的早期阶段开始的延续,它被称为“C plus classes”。实际上,早期的cfront C ++编译器是如此命名的,因为它将C ++源代码转换为C,然后将其转换为适当的C编译器(即C的前端,因此cfront )。

这样就可以让原作者Bjarne最大限度地减少交付C ++的工作量,因为它的大部分已经由C编译器本身提供。

在解析语言方面,处理unsigned long int x (a)肯定比处理ulong x更难。

但是,鉴于编译器已经必须为变量处理大量可选的“修饰符/说明符”(例如,const char * const x),处理其他几个语句对于该课程来说是相同的。

(a)int long unsigned xlong unsigned x或任何其他类型说明符最终成为单数unsigned long int 。有关详细信息,请参阅here

答案 1 :(得分:0)

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

相比之下,如果某个特定的保留字序列在任何现有实现中都没有定义的含义,则可能没有现有的代码使用该保留字序列,因此没有通过附加新含义来破坏现有代码的危险它