C语言中的大多数关键字(或与此相关的任何语言)都以字母开头。但是有些关键字以下划线开头吗?这些关键字是:_Alignas,_Alignof,_Atomic,_Bool,_Complex,_Generic,_Imaginary,_Noreturn,_Static_assert和_Thread_local。
我觉得这很奇怪。如果它是不是API真正组成部分的隐藏的全局常量或内部函数,我会理解的。但是这些都是关键词。
当C实际上有一个称为bool和的宏static_assert并且它们的实现使用关键字时,我感到特别奇怪。
Eri*_*hil 10
C在标准委员会计划之前就已经发展并非常流行。结果,有很多现有的代码。
在设置C标准或更新旧标准时,一个重要的目标不是“破坏”旧代码。希望与以前的编译器一起工作的代码继续与C语言的新版本一起工作。
引入新的关键字(或单词的任何新定义或含义)可能会破坏旧代码,因为在编译时,该单词将具有其新关键字含义,而不是先前编译器具有的标识符含义。该代码将必须进行编辑。除了要花钱去编辑代码之外,如果有任何错误,这也有引入错误的风险。
为了解决这个问题,制定了一个规则,即以下划线开头的标识符被保留。制定此规则并不会破坏很多旧软件,因为大多数编写软件的人都选择使用以字母开头而不是下划线的标识符。该规则为C标准提供了一项新功能:通过在添加新关键字或单词的其他新含义时使用下划线,只要遵守旧规则,就可以在不破坏旧代码的情况下做到这一点。
C标准的新版本有时会为不以下划线开头的单词引入新的含义,例如bool。但是,这些新含义通常不会在核心语言中引入。相反,它们仅在新的头文件中引入。在创建bool类型时,C标准提供了新的标头<stdbool.h>。因为旧代码不能包括<stdbool.h>由于代码编写时不存在的,定义bool在<stdbool.h>不打破旧的代码。同时,bool通过包含,它使编写新代码的程序员能够使用新功能<stdbool.h>。
在标准中,保留以双下划线或下划线后跟大写字母开头的任何名称。这很有用,因为C缺少命名空间。通过保留所有这些符号,可以将新的和特定于实现的关键字引入该语言,而不会与现有代码中定义的符号冲突。
诸如bool和的宏static_assert是“ 便捷宏 ”,它们使您可以使用保留的关键字符号,而不会引起下划线和大写,而不会造成名称冲突。但是,它们提供了解决名称冲突的方法,因为与关键字不同,宏可能是#undefined的,或者排除了定义其的标头,并且直接使用了内部关键字。此外,未修改的旧代码不会被破坏,因为根据定义,它将不包含编写时不存在的标头
自从该语言诞生以来就已经在该语言中定义了无修饰关键字(C99 除外,inline并且restrict自C99以来已定义),因此不会与传统代码符号产生冲突。所有_Xxxx关键字均在C99或之后定义。
与当今许多常用语言不同,C语言自1970年代就出现了,并且自1989年以来就已经标准化-有大量现有代码必须在现代编译器上仍可编译,而同时该语言也不能保持不变-如果这样做的话可能不再常用。