引用cp首选项站点

在函数参数列表中,在数组声明符中允许使用其他语法元素:关键字静态和限定符,它们可以以任何顺序出现在大小表达式之前(即使省略了大小表达式,它们也可以出现).

如果存在限定符,则它们限定数组参数类型转换为的指针类型:

int f(const int a[20])
{
// in this function, a has type const int* (pointer to const int)
}
int g(const int a[const 20])
{
// in this function, a has type const int* const (const pointer to const int)
}

但是,上面的代码片段不能使用/std:c17标志在MSVC V19上编译,并出现错误:

<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: ')'

https://godbolt.org/z/8r9388PYn

这是一个MSVC错误,还是这个规范是可选的?

If this is a m和atory specification can you redirect me to the relative paragraph of the C17 st和ard?

推荐答案

C标准需要一致的C实现才能接受这些限定符(C 2018 6.7.6 1和6.7.6.3 7).MSVC不是一个符合规范的编译器.

6.7.6 1显示了声明符的语法,包括:

  • direct-declarator [ type-qualifier-listopt assignment-expressionopt ]

没有迹象表明语法的这一部分是可选的.

6.7.6.3 7规定了限定词的解释:

将参数声明为"type的数组"应调整为"指向type的合格指针",其中类型限定符(如果有)是在数组类型派生…的第[]中指定的那些

C++相关问答推荐

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

我编译了一个新的c程序,并收到以下错误

如何使用低级C++写出数值

识别和处理c中整数溢出的最佳方法?

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

如何在c++中包装返回空*的函数

在C++中使用函数指针的正确语法

文件权限为0666,但即使以超级用户身份也无法打开

为什么将函数名括在括号中会禁用隐式声明?

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

将数组插入数组

试图创建一个基本的Word克隆,但遇到了障碍

C:如何将此代码转换为与数组一起使用?

为什么编译器不能简单地将数据从EDI转移到EAX?

C标准关于外部常量的说明

如何在zOS上编译共享C库

C Makefile - 如何避免重复提及文件名

为什么实现文件中的自由函数默认没有内部链接?