c - "volatile const int a"与 "const volatile int a"?

标签 c

我的理解是,如果我们将 volatileconst 一起用于变量,则表示该变量值不能在代码范围内更改,但可以通过以下方式更改范围外 - 例如,与变量 a 的硬件交互。

但是语法 volatile const int aconst volatile int a 之间有什么区别?

最佳答案

当不涉及指针时,修饰符顺序并不重要。你的两个例子是等价的。

如果涉及指针,则顺序仅与核心类型的名称和*相关。对于带有修饰符 A、B、C 和 D 占位符的变量声明:

<A> int <B> * <C> * <D>

location A B 修改 int (int constconst int 表示相同的意思),而位置 C 影响第一个 * (第二级间接),而位置 D 影响第二个 * (第一级间接)。

所以:

unsigned int * volatile * const x;

意味着:

  1. 您无法重新分配 x 本身(但可以重新分配 *x**x)
  2. *x volatile (编译器无法优化对 *x 的读取或写入,并且无法将它们相对重新排序)其他 volatile 访问)
  3. **xunsigned (但既不是 volatile 也不是 const,尽管 *x volatile 将导致应用 volatile 的某些方面,仅仅是因为不允许缓存 *x,因此可以' t 缓存 **x 之一;如果您的代码显式缓存,例如 unsigned int *starxcopy = *x;,则使用 *starxcopy*starxcopy将能够缓存指向的值,因为该值本身不是 volatile )

关于c - "volatile const int a"与 "const volatile int a"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73080838/

相关文章:

c++ - 带有 C 接口(interface)的 Objective C 库

c - 从文件中读取位并将其存储到 C 中的 char 数组中

c - 使文本无效或剪辑文本

c - 如何安全且可移植地创建临时文件并获取其名称

c - 将结构存储在共享内存中是一种好习惯吗?

代码看起来不错,但为什么它要求两次 E 并不断打印 0.000?

c - 生成文件错误 *** 没有规则可生成 `3' 所需的目标 `run'。停止

c - c 程序的意外行为,试图从 K&R 解决 E6-2

c - 函数一直返回 0 且未读取参数

python - 我可以使用哪个工具(gdb?xcode?pdb?等)来查找 C 扩展 python 程序中的内存泄漏?