You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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标准)中:

  1. 6.7.6.3 函数声明符(包括原型)第7款:

声明为“类型数组”的函数参数应调整为“指向类型的指针”,其中类型是数组类型的元素类型,且对于每个数组类型推导,数组类型的所有限定符都将应用于指针类型。此外,如果数组类型的声明符包含static和表达式,那么表达式应是整数常量表达式,且在调用函数时,对应的实际参数应指向数组的第一个元素,该数组至少具有表达式指定的元素个数。如果数组类型的声明符包含限定符qualifier,那么限定符将应用于指针类型。

  1. 6.7.6.2 数组声明符第4款:

数组类型的声明符的格式为:
[ 类型限定符列表opt 表达式opt ]
或者
[ static 类型限定符列表opt 表达式 ]
或者
[ 类型限定符列表opt static 表达式 ]

这里的类型限定符列表允许包含const等限定符,支持出现在数组大小表达式之前或与static组合,完全匹配cppreference所描述的语法。


内容的提问来源于stack exchange,提问作者Fabio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:24:16