扩展C标准中的“声明-说明符”的语法,我得到了一个语法,它允许许多语义上不合逻辑的说明符的组合。有没有人写过一种更精确的语法,允许更少的矛盾组合?语法的无序性(可以推测,这样程序员就不必记住一个说明符的顺序)使得这变得复杂起来。如果有一些符号来指定“任何一种选择的说明符,但只允许每种选择中的一种出现”(这并不是特别好的),就会有帮助。还是我撞错了树?例如,如果有一组很好的简洁的语义规则来指定哪些组合(不允许)在一起。根据我对C标准的解释,语法是
声明-说明符:(storage-class-specifier|type-specifier|type-qualifier|function-specifier|alignment-specifier)+
存储类说明符:'typedef'|'extern'|'static'|'_Thread_local'|'auto'|'register‘
类型说明符:'void'|'char'|'short'|'int'|'long'|'float'|'double'|'signed'|'unsigned'|'_Bool'|'_Complex‘name '_Atomic’(‘type-name ')’{##**$$}#\x{e76f}\{e76f}
类型-限定符:‘const’\{e76f}\
函数说明符:“内联”、“_Noreturn”
对齐-说明符:“_Alignas”(“类型名称”、“常量-表达式”)
发布于 2020-04-06 13:22:14
C标准不包含关于如何在特定对象声明中实现声明说明符、存储类说明符、类型说明符、数据类型说明符或对齐说明符的顺序的规则。
你可以随意把它们混为一谈。
引用ISO/IEC 9899:2018,第6.7.2/2节
“在每个声明中的声明说明符中,以及在每个结构声明和类型名称中的说明符-限定符列表中,至少应该给出一个类型说明符。每个类型说明符的列表应该是以下多个集合之一(在每个项有多个多集时,由逗号分隔);类型说明符可能以任何顺序出现,可能与其他声明说明符__混合。”
唯一的限制是,至少必须提供一个类型说明符和至少一个标识符,并且标识符必须位于声明的右侧。
顺便说一句,还有一件事要考虑,尽管它在语法上是正确的。在第一个位置以外的任何地方放置存储类说明符都是过时的。
引用ISO/IEC 9899:2011,第6.11.5节-存储类说明符:
“在声明中放置声明说明符以外的存储类说明符是一个过时的特性。”
因此,
static const long long int a;可以写成:
static long int const long a;或
static long const long int a;或
static int const long long a;但是,为了保持代码的可读性和对未来读者的清晰,您应该使用常见的约定。
https://stackoverflow.com/questions/61060424
复制相似问题