数组下标中出现 "volatile" 关键字的目的是什么?
What is the purpose of the "volatile" keyword appearing inside an array subscript?
在浏览 cppreference 时,我在函数参数中看到了一个奇怪的类型数组,如下所示:
void f(double x[volatile], const double y[volatile]);
那么,数组下标中出现volatile
关键字的目的是什么?它有什么作用?
volatile
关键字用于声明函数参数的数组类型。
这里,double x[volatile]
相当于double * volatile x
。
cppreference 说:
In a function declaration, the keyword volatile
may appear inside the
square brackets that are used to declare an array type of a function
parameter. It qualifies the pointer type to which the array type is
transformed. The following two declarations declare the same function:
void f(double x[volatile], const double y[volatile]);
void f(double * volatile x, const double * volatile y);
此语法仅在 C 语言的函数参数中有效。
一般来说,此 C(且仅适用于 C!)功能允许在数组括号内指定任何类型限定符;准确的标准报价为:
A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to
type’’, where the type qualifiers (if any) are those specified within the [
and ]
of the
array type derivation. If the keyword static
also appears within the [
and ]
of the
array type derivation, then for each call to the function, the value of the corresponding
actual argument shall provide access to the first element of an array with at least as many
elements as specified by the size expression.
(C99,§6.7.5.3,¶7,已强调)
这意味着这不仅限于 volatile
,还允许使用 const
和 restrict
(参见 类型限定符 , §6.7.3 ¶1).
这个 hack 的要点本质上是让您将类型限定符 添加到参数 ( 而不是 到数组的元素) 并仍然保留声明的数组语法;如果没有这种语法,您将被迫退回到将其作为指针写出来(无论如何归结为除了static
案例,AFAIK没有'没有等效的指针语法)。
我怀疑这个想法主要是为了让多维数组的语法稍微不那么笨拙;引用§6.7.5.3¶21:
void f(double (* restrict a)[5]);
void f(double a[restrict][5]);
void f(double a[restrict 3][5]);
都是等价的,但是 2 和 3 可能会更好地表达这不仅仅是一个指针,而是一个数组,并且仍然允许在某些地方放置 restrict
限定符。
另外,上面说了,好像没有办法有类似的东西
void f(double a[restrict static 3][5]);
(which "also specifies that the argument corresponding to a
in any call to f
must be a non-null pointer to the first of at least three arrays of 5 doubles", 同上) 与 "regular" 指针语法。
不过,我会远离这种语法;它非常晦涩,很少使用(我认为我不需要向数组添加类型限定符 parameter - 同样,参数本身,而不是元素类型;restrict
是唯一有意义的用例)- 并且不可移植到 C++(如果您正在编写库,这通常是相关的)。
在浏览 cppreference 时,我在函数参数中看到了一个奇怪的类型数组,如下所示:
void f(double x[volatile], const double y[volatile]);
那么,数组下标中出现volatile
关键字的目的是什么?它有什么作用?
volatile
关键字用于声明函数参数的数组类型。
这里,double x[volatile]
相当于double * volatile x
。
cppreference 说:
In a function declaration, the keyword
volatile
may appear inside the square brackets that are used to declare an array type of a function parameter. It qualifies the pointer type to which the array type is transformed. The following two declarations declare the same function:void f(double x[volatile], const double y[volatile]); void f(double * volatile x, const double * volatile y);
此语法仅在 C 语言的函数参数中有效。
一般来说,此 C(且仅适用于 C!)功能允许在数组括号内指定任何类型限定符;准确的标准报价为:
A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the
[
and]
of the array type derivation. If the keywordstatic
also appears within the[
and]
of the array type derivation, then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression.
(C99,§6.7.5.3,¶7,已强调)
这意味着这不仅限于 volatile
,还允许使用 const
和 restrict
(参见 类型限定符 , §6.7.3 ¶1).
这个 hack 的要点本质上是让您将类型限定符 添加到参数 ( 而不是 到数组的元素) 并仍然保留声明的数组语法;如果没有这种语法,您将被迫退回到将其作为指针写出来(无论如何归结为除了static
案例,AFAIK没有'没有等效的指针语法)。
我怀疑这个想法主要是为了让多维数组的语法稍微不那么笨拙;引用§6.7.5.3¶21:
void f(double (* restrict a)[5]);
void f(double a[restrict][5]);
void f(double a[restrict 3][5]);
都是等价的,但是 2 和 3 可能会更好地表达这不仅仅是一个指针,而是一个数组,并且仍然允许在某些地方放置 restrict
限定符。
另外,上面说了,好像没有办法有类似的东西
void f(double a[restrict static 3][5]);
(which "also specifies that the argument corresponding to a
in any call to f
must be a non-null pointer to the first of at least three arrays of 5 doubles", 同上) 与 "regular" 指针语法。
不过,我会远离这种语法;它非常晦涩,很少使用(我认为我不需要向数组添加类型限定符 parameter - 同样,参数本身,而不是元素类型;restrict
是唯一有意义的用例)- 并且不可移植到 C++(如果您正在编写库,这通常是相关的)。