Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C基本类型的标识符有多个关键字_C++_C_Language Lawyer - Fatal编程技术网

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

C++ 为什么C基本类型的标识符有多个关键字,c++,c,language-lawyer,C++,C,Language Lawyer,除了显而易见的答案,因为伙计们是这样设计的,为什么C/C++有由多个标识符组成的类型,例如 long-long(int) short int signed char A确实有一些解析的基本知识,并且使用flex/bison工具制作了一些解析器,我认为这会给解析类型名带来更大的复杂性。从标准中看C++语法,所有类型的问题都很复杂。 我知道,C++(也C,我相信)没有对基本数据类型的大小进行很多指定,因此,类型 ITE88/COD>, UTIN 8//>等将不起作用(尽管C++ 11给我们)。

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

  • long-long(int)
  • short int
  • signed char
A确实有一些解析的基本知识,并且使用flex/bison工具制作了一些解析器,我认为这会给解析类型名带来更大的复杂性。从标准中看C++语法,所有类型的问题都很复杂。 <>我知道,C++(也C,我相信)没有对基本数据类型的大小进行很多指定,因此,类型<代码> ITE88/COD>,<代码> UTIN 8//>等将不起作用(尽管C++ 11给我们)。
那么,为什么标准的开发人员同意使用多词类型标识符,而他们可以使用
int
uint
和类似的标识符。

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

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

委员会在审议期间评估了许多关于增加、删除和修改基础文件的提案。只要能够确定明确和一致的做法,就一致努力编纂现有做法。然而,在无法确定一致做法的情况下,委员会努力制定与该语言总体风格一致的明确规则

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

最初的X3J11章程明确要求编纂现有的通用实践,而C89委员会在任何明确无误的地方都坚持先例。C89定义的绝大多数语言与Brian Kernighan和Dennis Ritchie在《C编程语言》第一版附录A中定义的语言完全相同,当时几乎所有C翻译器都实现了这一点

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

现有代码很重要,而现有实现则不重要。大量C代码具有相当大的商业价值。已尽一切努力确保本规范的大部分内容可被符合本标准的任何实施所接受。C89委员会不想强迫大多数程序员修改他们的C程序,只是为了让合格的翻译接受它们

因此,虽然该标准的较新版本为我们提供了类似于具有固定宽度整数类型的
stdint.h
,但删除像
int
long
这样的标准类型将严重违反该准则


从C++的角度来看,它几乎可以肯定是从语言的最早的时代开始的,它被提出为“C +类”。实际上,非常早的代码< c> cFord/c> C++编译器是这样命名的,因为它在把C++代码源给C编译器之前(即C的前端,因此<代码> cFord),将它转换成C。 <>这将允许原始作者BjARNE最小化C++中的工作负载,因为它的大部分已经由C编译器本身提供了。
就解析语言而言,处理
无符号长整数x
(a)肯定比处理
ulong x
更困难

<>但是,鉴于编译器已经为变量处理了大量可选的“修饰符/说明符”(例如,<代码> const char * const x/COD>),处理其他几个是这个过程的标准。

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

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


相反,如果某个特定的保留字序列在任何现有实现中都没有定义的含义,那么就不会有使用该保留字序列的现有代码,因此也不会有通过附加新的含义来破坏现有代码的危险。

C++拥有它,因为它最初是C的一个扩展,它从一开始就拥有它(除了C99中引入的
long
)。也许最好将这个问题重新表述为应用于C语言。它可以使词法分析器更复杂,也可以使解析器更复杂,但不能使类型系统本身更复杂。即便如此,解析也没有那么复杂:解析器看到一个标记
long
,然后像往常一样检查下一个标记。它是一个标识符吗?星号?另一个
long
令牌?其他东西有效还是无效?真的没什么大不了的。@JoachimPileborg C很难解析,因为决定短语结构的是类型名,而不是简单的类型标记。除非采用C语言的严格子集,否则无法真正分离解析(例如,声明)和解释(类型定义)。@Rhymoid一旦解析器知道它在处理什么,它就没有那么复杂了。真正复杂的是,如果解析器看到标识符,它就无法知道它是表达式、语句还是声明/定义。在C中,它是一个简单的查找,它是一个类型名称或其他东西,但在C++中更糟,在这里,可以使用类型名来引入变量声明/定义或强制表达式或创建临时OB。