gpt4 book ai didi

c++ - volatile 结构与类型转换

转载 作者:太空宇宙 更新时间:2023-11-04 15:39:39 25 4
gpt4 key购买 nike

我的代码中有以下声明:

h 文件:

typedef struct {
bool qualified : 1;
bool running : 1;
} calibration_state_t;

calibration_state_t get_calibration_state();

cpp文件:

volatile calibration_state_t calibration_state = {false ,false};

函数

calibration_state_t get_calibration_state() {
return *(calibration_state_t *)&calibration_state;
}

编译。但是,如果我将 return 语句替换为

return (calibration_state_t)calibration_state;

它失败了

dcf77.cpp: In function ‘DCF77_Frequency_Control::calibration_state_t DCF77_Frequency_Control::get_calibration_state()’:
dcf77.cpp:2923:37: error: no matching function for call to ‘DCF77_Frequency_Control::calibration_state_t::calibration_state_t(volatile DCF77_Frequency_Control::calibration_state_t&)’
dcf77.h:204:7: note: candidates are: DCF77_Frequency_Control::calibration_state_t::calibration_state_t()
dcf77.h:204:7: note: DCF77_Frequency_Control::calibration_state_t::calibration_state_t(const DCF77_Frequency_Control::calibration_state_t&)

编译器是 avr-gcc,但我怀疑这无关紧要。为什么编译器无法编译类型转换?我如何以一种干净的方式获得所需的返回值?

最佳答案

您使用强制转换的代码具有未定义的行为(§7.1.6.1 [dcl.type.cv]/p6):

If an attempt is made to refer to an object defined with a volatile-qualified type through the use of a glvalue with a non-volatile-qualified type, the program behavior is undefined.

*(calibration_state_t *)&calibration_statecalibration_state_t 类型的左值,它是一种非 volatile 限定类型,用于引用 calibration_state,一个用 volatile 限定类型定义的对象。未定义的行为结果。

依靠未定义的行为来获得你想要的语义是非常危险的。虽然编译器不太可能真正变出鼻恶魔或吹掉你的腿(尽管这是允许的),但优化编译器可能会根据未定义的行为合法地假设 get_calibration_state 永远不会被调用,并且任何包含它的代码路径不可访问,并相应地生成代码。这种依赖于未定义行为的优化可能而且确实会发生。

在引用绑定(bind)中,volatile 就像const - 你不能将一个const 对象绑定(bind)到一个非const 引用,并且您不能将 volatile 对象绑定(bind)到非 volatile 引用。为您的类提供一个采用 const volatile & 的复制构造函数。

关于c++ - volatile 结构与类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25630662/

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