赋值从指针目标类型中丢弃'volatile'限定符

ray*_*ray 5 c embedded pointers volatile

我一直在使用微处理器从传感器读取温度,并且遇到有关易失性声明的以下警告.

"赋值从指针目标类型中丢弃'volatile'限定符"

我收到一个温度值,在重新启动程序之前,值不会改变.

  volatile uint16_t temp_value = 0;

  if (value_type == UA_TYPE_UInt16)
  {
      data_value.value_UInt16 = &temp_value; // warning*******

      switch (handle)
      {
            case HANDLE_TEMP1:
              temp_value = ADC_GetConversionValue(ADC3);
              break;
      }
  }
Run Code Online (Sandbox Code Playgroud)

在搜索堆栈溢出后,我意识到将temp_value声明为volatile将表示temp_value将更改值.我在这个网站上找不到的是为什么我不能为data_value.value_UInt16使用volatile无符号整数

我将ADC值存储在服务器中,并希望随时访问更新的值.是否有一个额外的类型转换我应该指向temp_value?谢谢阅读.

qua*_*dev 9

volatile uint16_t temp_value对编译器说"我的变量temp_value可能会被你不知道的东西改变"(特别是其他进程访问和写入用于存储变量的内存).除此之外,它还会阻止编译器进行某些优化.

当你这样做时:

data_value.value_UInt16 = &temp_value;
Run Code Online (Sandbox Code Playgroud)

(我认为这value_UInt16是非易失性的)

您将地址分配给volatile非易失性字段:编译器警告您允许对其进行优化,忽略指针对象可能会"通过它不知道的事物"进行更改.


方案:

1)Typecast data_value.value_UInt16 = *(uint16_t*)&temp_value,对编译器说:"我知道我在做什么,我知道我在这里忽略了volatile限定符".

要么,

2)创造value_UInt16一个volatile领域


重要的提示:

你标记了C++和C但是:

  • 在C++中,这是一个错误(无效转换),这里的示例.
  • 在C中,它是一个警告(你展示的那个)


Fal*_*ias 1

volatile 的工作方式与 const 基本相同。这段代码

const int i = 1;
int* iPtr = &i; //error
Run Code Online (Sandbox Code Playgroud)

无效,因为它尝试将指向 const 的指针分配给指向非 const 的指针。相似地,

volatile int i = 1;
int* iPtr = &i; //error
Run Code Online (Sandbox Code Playgroud)

出于同样的原因无效,除了易失性。尽管您的示例不完整,但这就是问题所在。