C17函数参数数组声明中的限定符是可选还是必选特性?
C17函数参数数组声明符限定符的MSVC编译问题
背景
根据cppreference的说明:
在函数参数列表中,数组声明符内允许使用额外语法元素:关键字static和限定符,它们可按任意顺序出现在大小表达式之前(即使省略大小表达式也可出现)。
若存在限定符,它们会限定数组参数类型转换后的指针类型:
对应的示例代码:
int f(const int a[20]) { // 在此函数中,a的类型为const int*(指向const int的指针) } int g(const int a[const 20]) { // 在此函数中,a的类型为const int* const(指向const int的const指针) }
但使用MSVC v19以/std:c17标志编译这段代码时会失败,报错信息如下:
<source>(5): error C2143: syntax error: missing ']' before 'const' <source>(5): error C2143: syntax error: missing ')' before 'const' <source>(5): error C2143: syntax error: missing '{' before 'const' <source>(5): error C2059: syntax error: 'constant' <source>(5): error C2059: syntax error: ')'
问题解答
这是MSVC的bug还是可选特性?
这是MSVC的未实现标准特性,属于编译器兼容性问题,并非该语法是可选特性。C17标准明确要求编译器支持该语法,因此MSVC的行为不符合C17标准规范。
C17标准的相关段落
在ISO/IEC 9899:2018(C17标准)中:
- 6.7.6.3 函数声明符(包括原型)第7款:
声明为“类型数组”的函数参数应调整为“指向类型的指针”,其中类型是数组类型的元素类型,且对于每个数组类型推导,数组类型的所有限定符都将应用于指针类型。此外,如果数组类型的声明符包含
static和表达式,那么表达式应是整数常量表达式,且在调用函数时,对应的实际参数应指向数组的第一个元素,该数组至少具有表达式指定的元素个数。如果数组类型的声明符包含限定符qualifier,那么限定符将应用于指针类型。
- 6.7.6.2 数组声明符第4款:
数组类型的声明符的格式为:
[类型限定符列表opt 表达式opt]
或者[static 类型限定符列表opt 表达式]
或者[类型限定符列表opt static 表达式]
这里的类型限定符列表允许包含const等限定符,支持出现在数组大小表达式之前或与static组合,完全匹配cppreference所描述的语法。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

