声明的数组不带大小且const volatile

时间:2018-10-12 12:19:10

标签: c arrays const volatile extern

我在工作项目中发现了这一行,但是我听不懂:

extern const volatile uint8 * const volatile array[];

能帮我解释一下这句话吗?

1 个答案:

答案 0 :(得分:3)

首先,省略限定符:

uint8 *array[];

array是一个不确定大小的数组,其元素类型为uint8 *。换句话说,是指向uint8的指针数组。

如果此声明作为函数的参数出现,则数组语法实际上是指针的简写形式。如果它不是函数参数,而是在文件范围内声明的,则它用作临时定义。完整的定义可能会在代码中的其他地方出现,该定义指定了大小以及可选的初始化程序。如果不存在其他完整定义,则将该数组定义为具有1个元素。

在讨论声明对限定词的含义之前,让我们首先讨论一下这些限定词的确切含义。

const限定词可防止代码修改命名对象。给出以下声明:

const int x;

这意味着无法使用例如x来修改x = 1。涉及到指针,这会有些棘手:

const int *x;

这将x定义为指向const int的指针。这意味着您可以修改x,但不能修改其指向的内容。因此x = &y是合法的,但不是*x = 1

int * const x;

这将x定义为指向const的{​​{1}}指针,这意味着您无法修改int,但可以修改其指向的内容。因此x是非法的,但x = &y是合法的。

*x = 1

这将const int * const x; 定义为指向x的{​​{1}}指针。因此,在这种情况下,const及其指向的内容都无法修改。

const int

在这里,x是一个数组,其元素是const int * const x[]; 指向x的指针。与前面的示例一样,对于每个数组元素,都不能修改数组元素及其指向的内容。

现在让我们谈谈const。该限定符告诉编译器有关的变量可能会意外地更改。来自C standard的6.7.3p7节:

  

具有volatile限定类型的对象可以在   实现方式未知或其他未知方面   效果。因此,任何引用此类对象的表达应   严格按照抽象机的规则进行评估,   如5.1.2.3中所述。此外,在每个序列点   最后存储在对象中的值应与   抽象机器,除非由未知因素修改   前面提到过。 134)什么构成对   具有volatile限定类型的对象是实现定义的

     

134)const int声明可用于描述对象   对应于内存映射的输入/输出端口或对象   由异步中断功能访问。动作   如此声明的对象不应被“优化”   实施或重新排序,除非以下规则允许   评估表达式

这意味着volatile对象可能会以编译器不知道的方式进行更改,因此,编译器不应对此变量执行任何优化,而实际上应该假定该值在外部已更改。

现在继续您的完整声明:

volatile

这将volatile声明为一个未指定大小的数组,其元素类型为const volatile uint8 * const volatile array[]; ,其中该数组的元素不能被程序修改(即array),但是可以可以在外部进行修改(即uint8 *),这些数组元素指向的内容也不能由程序更改,而可以在外部进行修改。