0

假设我有以下代码:

my_struct_member_type *foo() {
    volatile my_struct *s = (my_struct *)SOME_ADDRESS;
    return &(s->struct_member);
}

foo 返回的指针是否也是 volatile 的?

编辑:后续行动:指针&(s->struct_member)在 foo 内部是 volatile 吗?

4

3 回答 3

1

是的。

Forvolatile my_struct *s表示您通过它看到的对象是volatile并且您通过此指针访问的所有成员都继承了volatile限定条件。

volatile如果返回类型没有说明,则返回指针的地址是违反约束的,您的编译器必须为此提供诊断。

编辑:volatile关键字的应用似乎也很混乱。在您的示例中,它适用于指向的对象,而不是指针本身。根据经验,在不改变类型的情况下,始终将限定符 ( constor volatile) 尽可能写在最右边。然后,您的示例将显示为:

my_struct volatile*s = (my_struct *)SOME_ADDRESS;

这完全不同于

my_struct *volatile s = (my_struct *)SOME_ADDRESS;

指针本身在哪里,volatile但不是它背后的对象。

编辑2:既然你问我的来源,实际的C标准,C11,6.8.6.4它说的是关于return声明:

如果表达式的类型与其出现的函数的返回类型不同,则该值被转换为好像通过赋值给具有该函数的返回类型的对象

因此,对于赋值运算符,6.15.16.1 对转换的期望是什么:

左操作数具有原子、限定或非限定指针类型,并且(考虑左操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左侧指向的类型具有所有右边指向的类型的限定符;

这里右边的尖类型volatile除了左边的之外还有限定符。

于 2012-08-08T08:54:06.170 回答
1

No.volatile是编译器提示,因此只有在编译器可以看到它时才会受到尊重。可以从另一个翻译单元调用该函数,该翻译单元不知道您volatile最初声明指针。

于 2012-08-08T08:05:44.283 回答
0

Volatile 在运行时没有意义,它用于告诉编译器不要优化对变量的访问。

返回 volatile 指针是无稽之谈。您将某些存储(左值)标记为易失性,而不是右值。

http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword

于 2012-08-08T08:07:33.020 回答