为什么C基本类型有多个关键字的标识符
Why do C fundamental types have identifiers with multiple keywords
除了明显的答案,因为,家伙们设计的方式,为什么C/c++有类型,它由多个标识符组成,例如
-
long long (int)
-
short int
-
signed char
我知道,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
这样的固定宽度整型,但去掉int
和long
这样的标准类型将严重违反该指导原则。
就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 x
或long unsigned x
或任何其他类型说明符,最终成为单数unsigned long int
类型。
向语言中添加新的保留词将破坏任何恰好使用这些词作为标识符的代码,除非这些词的形式是为将来扩展而保留的(例如包含两个下划线,或者以下划线和大写字母开头,等等)
相反,如果某些特定的保留字序列在任何现有的实现中没有定义的意义,则不可能存在使用该保留字序列的现有代码,因此没有通过附加新含义来破坏现有代码的危险。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何确保C++函数在定义之前声明(如override关键字)
- #ifdef和未声明的标识符
- f2、f3、f4标识符未找到
- 谷歌模拟和覆盖关键字
- 设置 Visual Studio for MPI: 找不到标识符错误
- 未声明的标识符编译暗黑破坏神 2 程序"muleview"
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 使用"class"关键字,后跟未声明的标识符
- 为什么在函数参数编译中没有标识符的const关键字
- 有没有一种方法可以在枚举中使用关键字作为标识符
- 提升::精神::Qi 关键字和标识符
- New关键字用作标识符
- 这个流控制关键字类标识符的结构是什么?
- 为什么C基本类型有多个关键字的标识符
- 解析除关键字以外的标识符