首页 > 解决方案 > C 编程语言的声明符说明符是否有更精确的语法?

问题描述

从 C 标准扩展“声明说明符”的语法,我得到一种语法,它允许许多语义上不合逻辑的说明符组合。有没有人写过更精确的语法,允许更少的矛盾组合?看起来语法的无序性质(推测是有意的,因此程序员不必记住说明符的顺序)使这变得复杂。如果有一些符号来指定“任何说明符的选择,但每个选择只允许出现一次”(措辞不是特别好),那将有所帮助。还是我在叫错树?例如,如果有一组简洁的语义规则指定哪些组合是(不允许)一起使用的。根据我对 C 标准的解释,语法是

声明说明符:(存储类说明符|类型说明符|类型限定符|函数说明符|对齐说明符)+

存储类说明符:'typedef'|'extern'|'static'|'_Thread_local'|'auto'|'register'

类型说明符:'void'|'char'|'short'|'int'|'long'|'float'|'double'|'signed'|'unsigned'|'_Bool'|'_Complex'| '_Atomic' '(' 类型名 ')' | 结构或联合说明符 | 枚举说明符 | 类型定义名称

类型限定符:'const'|'restrict'|'volatile'|'_Atomic'

函数说明符:'inline' | '_Noreturn'

对齐说明符:'_Alignas' '(' type-name | constant-expression ')'

标签: csyntax

解决方案


语言定义中有单独的约束来指定声明说明符的哪些组合是合法的;它没有在语法本身中指定。例如:

6.7.2 类型说明符
...
约束

2 在每个声明的声明说明符中,以及每个结构声明和类型名称的说明符-限定符列表中,至少应给出一个类型说明符。每个类型说明符列表应为以下多重集之一(当每个项目有多个多重集时,以逗号分隔);类型说明符可以以任何顺序出现,可能与其他声明说明符混合。

— void
— char
— signed char
— unsigned char
— short、signed short、short int 或 signed short int
— unsigned short 或 unsigned short int
— int、signed 或 signed int
— unsigned 或 unsigned int
— long、signed long、long int 或 signed long int
— unsigned long 或 unsigned long int
— long long、signed long long、long long int 或 signed long long int
— unsigned long long 或 unsigned long long int
— 浮点数
— double
— long double
— _Bool
— float _Complex
— double _Complex
— long double _Complex
— 原子类型说明符
— 结构或联合说明符
— 枚举说明符
— typedef 名称

C 2011 在线草案

虽然所有这些可能可以在语法中编码,但它会很麻烦。我认为,让它成为一个单独的约束会让生活变得更轻松(也更容易引入新的组合,或弃用旧的组合)。


推荐阅读