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