ANSI C是这样的吗?

ig9co6j1  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(133)

“const和volatile限定符可以在任何声明之前。”
我在一个在线测试系列中看到这个语句被标记为true。

declaration:
     declaration-specifiers init-declarator-listopt ;
declaration-specifiers:
     storage-class-specifier declaration-specifiersopt
     type-specifier declaration-specifiersopt
     type-qualifier declaration-specifiersopt
     function-specifier declaration-specifiersopt
init-declarator-list:
     init-declarator
     init-declarator-list , init-declarator
init-declarator:
     declarator
     declarator = initializer

从上面看来,这种说法可能会对一些声明产生错误。
救命啊!
编辑:我知道这对ISO C89或更高版本无效,但请对ANSI提出建议,以便教育当局以一些证据被告知问题bug。

xlpyo6sf

xlpyo6sf1#

类型限定符声明说明符(opt)
允许类型限定符,如constvolatile,后跟声明说明符。声明说明符后面的那些可以是函数声明。

6ovsh4lw

6ovsh4lw2#

你确实可以在任何声明之前放置constvolatile,而不会违反C的语法规则。这并不意味着这样的结构有意义,不会被完全忽略,或者不会因其他原因触发编译错误。它只意味着它不会触发语法错误。
C89规范的第3.5.3节规定
如果函数类型的规范包括任何类型限定符,则行为未定义。
这意味着,只要你不实际 * 调用 * 这个函数,将函数声明为constvolatile是完全法律的的。如果你试图调用它,不知道会发生什么。这是你可以在C中做的几件事情之一,从技术上讲,这是合法的语法,但完全没有意义(就像声明1 == 3;x + 2;)。
为了在编辑中澄清您的注解,请注意术语“ANSI C”和“C89”指的是同一件事。C的ANSI和ISO标准仅在格式上有所不同。这些标准的内容通常称为“C89”或“C90”。(以区别于C99,ANSI后来也对C99进行了标准化)。当你说“我知道这对ISO C89或更高版本无效”时,你的语句也包括“ANSI C”。

相关问题