指针的“volatile”属性是继承的吗?

时间:2012-08-08 07:54:47

标签: c pointers volatile

假设我有以下代码:

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

foo返回的指针也是不稳定的吗?

编辑:后续:foo内的指针&(s->struct_member)是否易变?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

对于volatile my_struct *s来说,您通过它看到的对象是volatile,并且您通过此指针访问的所有成员都会继承volatile资格。

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

修改volatile关键字适用的位置似乎也存在混淆。在您的示例中,它适用于指向的对象,而不是指针本身。根据经验,总是在没有类型更改的情况下尽可能向右写限定符(constvolatile)。那么你的例子就是:

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限定符相加。

答案 2 :(得分:0)

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

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

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