2

“ const 和 volatile 限定符可以在任何声明之前。”

我在一个在线测试系列中看到这个声明被标记为真的。但在标准 C(89) 中我可以看到

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 提出建议,以便教育当局通过一些证据了解问题错误。

4

2 回答 2

3

类型限定符声明说明符(opt)

允许类型限定符,例如constor volatile,后跟声明说明符。后面的声明说明符可以是函数声明。

于 2012-07-23T12:50:55.083 回答
0

您确实可以在不违反 C 语法规则的情况下放置const或放在任何声明之前。volatile这绝不意味着这样的构造有意义,不会被完全忽略,或者不会因为其他原因触发编译错误。这只意味着它不会触发语法错误。

C89 规范第 3.5.3 节规定

如果函数类型的规范包含任何类型限定符,则行为未定义。

这意味着将函数声明为constor是完全合法的volatile,只要您实际上并未调用该函数。如果您尝试调用它,则不知道会发生什么。这是您在 C 中可以做的几件事之一,这些事情在技术上是合法的语法,但完全没有意义(如语句1 == 3;x + 2;)。

为了澄清您在编辑中的评论,请注意术语“ANSI C”和“C89”指的是同一件事。C 有 ANSI 和 ISO 标准,仅在格式上有所不同。这些标准的内容就是通常所说的“C89”或“C90”(以区别于后来被 ANSI 标准化的 C99)。当您说“我知道这对 ISO C89 或更高版本无效”时,您的声明也包括“ANSI C”。

于 2013-01-05T00:10:44.290 回答