嵌入式基础–关键字const的特殊性  

2015年08A1F1

C中的关键字const最多可能是一个误导类型限定符。有人会认为const将指定特定符号为常数,但不幸的是并非如此。 C开发人员可以为const使用的最佳定义是,它提供对符号所代表的内存位置的“只读”访问。以以下声明为例:

const int x = 14;

声明指出x是值为14的只读符号。尝试使用符号x修改x都将导致编译器警告,正如人们可能期望的一个常量一样。关键字const不能保护x所占用的内存位置不被间接操作。以下面的代码为例:

整数* y =&x;

上面的语句正在创建一个指向只读x符号占用的存储位置的指针。有人会认为,如果指针试图更改不允许的值,那么不幸的是事实并非如此。通过取消引用y并提供新的值(例如16),可以间接修改存储位置,并且x的值现在为16。

* y = 16; /*完全有效! * /

密切关注的开发人员将意识到y是指向const的指针,并且声明可以更改为

const int * y =&x;

尝试取消引用指针并更改值的尝试现在将被编译器捕获。现在,一切似乎都是正确的,除了另一个开发人员出现时,他们决定要通过指针更改值,然后抛弃const,强制按以下方式更改值:

*(int *)y = 16;

显然,这种类型的行为会被高度反对,但是重要的是要意识到const以这种方式行为。与声明指针y有关的另一个有趣的点是,当指针指向只读整数时,指针本身不是只读的!如下代码将是完全合法的:

y ++;

y–;

y = y + 0x1000;

开发人员该怎么做才能确保指针不能更改为指向x以外的任何东西?可以使用如下混淆的声明:

const int * const y =&x;

上面的声明将符号y定义为指向只读整数的只读指针。感到困惑了吗?

在嵌入式系统中使用const的优点之一是,在许多情况下,将符号声明为const会强制将该符号存储在ROM中。当符号存储在ROM中时,尝试更改符号值的间接方法将不起作用。危险是该行为未在C标准中指定!开发人员必须注意了解编译器在做什么以及它在哪里存储只读值。

尽管const具有特殊性,但在适当的地方使用它并保护应为只读的符号仍然很重要。建议大量使用的一个方面是防止传递给函数的参数被写入。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.