我在工作项目中发现了这一行,但是我听不懂:
extern const volatile uint8 * const volatile array[];
能帮我解释一下这句话吗?
答案 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 *
),这些数组元素指向的内容也不能由程序更改,而可以在外部进行修改。