gpt4 book ai didi

c++ - C/C++ : casting away volatile considered harmful?

转载 作者:IT老高 更新时间:2023-10-28 23:09:44 25 4
gpt4 key购买 nike

(与此问题 Is It Safe to Cast Away volatile? 相关,但不完全相同,因为该问题与特定实例有关)

是否有过抛弃 volatile视为危险做法的情况?

(一个特别的例子:如果声明了一个函数

void foo(long *pl);

我必须实现

void bar(volatile long *pl);

由于我的部分实现需要 bar() 调用 foo(pl),那么我似乎无法让它按原样工作,因为编译 foo() 和编译bar() 的调用者不兼容。)


作为推论,如果我有一个 volatile 变量 v,并且我想用别人的函数 void foo(long * pl),那个人告诉我它是安全的,我可以在调用之前直接转换指针,我的直觉是告诉他们他们错了,因为没有办法保证这一点,他们应该改变声明void foo(volatile long *pl) 如果他们想支持使用 volatile 变量。我们谁是正确的?

最佳答案

如果变量是declared volatile,那么丢弃volatile就是未定义的行为,就像从声明的变量 const 中丢弃 const 是未定义的行为。参见 C 标准的附录 J.2:

The behavior is undefined in the following circumstances:

...

— An attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type (6.7.3).

— An attempt is made to refer to an object defined with a volatile-qualified type through use of an lvalue with non-volatile-qualified type (6.7.3).

但是,如果您只有一个 volatile 指针或一个对非 volatile 变量的 volatile 引用,那么您可以随意丢弃 volatile

volatile int i=0;
int j=0;

volatile int* pvi=&i; // ok
volatile int* pvj=&j; // ok can take a volatile pointer to a non-volatile object

int* pi=const_cast<int*>(pvi); // Danger Will Robinson! casting away true volatile
int* pj=const_cast<volatile int*>(pvj); // OK
*pi=3; // undefined behaviour, non-volatile access to volatile variable
*pj=3; // OK, j is not volatile

关于c++ - C/C++ : casting away volatile considered harmful?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com