假设我有以下代码:
my_struct_member_type *foo() {
volatile my_struct *s = (my_struct *)SOME_ADDRESS;
return &(s->struct_member);
}
foo 返回的指针是否也是 volatile 的?
编辑:后续行动:指针&(s->struct_member)
在 foo 内部是 volatile 吗?
是的。
Forvolatile my_struct *s
表示您通过它看到的对象是volatile
并且您通过此指针访问的所有成员都继承了volatile
限定条件。
volatile
如果返回类型没有说明,则返回指针的地址是违反约束的,您的编译器必须为此提供诊断。
编辑:volatile
关键字的应用似乎也很混乱。在您的示例中,它适用于指向的对象,而不是指针本身。根据经验,在不改变类型的情况下,始终将限定符 ( const
or 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
除了左边的之外还有限定符。
No.volatile
是编译器提示,因此只有在编译器可以看到它时才会受到尊重。可以从另一个翻译单元调用该函数,该翻译单元不知道您volatile
最初声明指针。
Volatile 在运行时没有意义,它用于告诉编译器不要优化对变量的访问。
返回 volatile 指针是无稽之谈。您将某些存储(左值)标记为易失性,而不是右值。
http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword