c - 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 ')'
解决方案
语言定义中有单独的约束来指定声明说明符的哪些组合是合法的;它没有在语法本身中指定。例如:
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 名称
虽然所有这些可能都可以在语法中编码,但它会很麻烦。我认为,让它成为一个单独的约束会让生活变得更轻松(也更容易引入新的组合,或弃用旧的组合)。
推荐阅读
- python - 如何将井字游戏推广到大于 3x3 的棋盘?
- python - Docker SDK python - 关于容器生成和 cpu_load 的通知
- javascript - Bootstrap 双列表框 POST Selected
- php - FPDF:旋转输出
- javascript - 如何更新内部嵌套对象属性
- mongodb - 如何从 MongoDb 中删除这些嵌入的文档?
- c++ - PCL 未使用 vcpkg 正确安装
- python - 使用 Spyder 下载 sklearn:pip 打印错误语法,并且找不到目录
- django - 获取 PositiveSmallIntegerField Django 字段的最大 **Allowed** 值
- angular - “字符串”类型的参数不能分配给“布尔”类型的参数