小编Set*_*son的帖子

在 C++ 中取消引用指向易失性结构的指针

我有一个指向某些易失性内存的指针,我试图取消引用该内存并将其复制到该结构的非限定副本(反之亦然)。存储器的格式由第三方结构定义指定。在 C 中,我可以取消引用内存,一切都很好。然而,C++抱怨它找不到合适的赋值运算符(clang的错误在这里比gcc清楚得多:候选函数(隐式复制赋值运算符)不可行:'this'参数具有类型'易失性vec',但方法是未标记为易失性)。此方法对于简单类型(例如整数)非常有效,但对于结构则失败。

在这种特殊情况下,所指向的值在读取对象期间不能更改,但我必须防止它们在读取过程中被缓存。

我发现我可以添加从易失性 T 到 T 的隐式转换吗?这给了我很多尝试的选择,但是我无法找到让它真正发挥作用的魔力。我怀疑所有这些解决方案都会失败,因为为什么不能使用非成员函数来重载赋值运算符?这将导致我的第三方定义的结构没有合适的结构,因为结构定义是第三方的,但这是理论上的,因为我什至无法让手动指定的成员函数完全工作(也许我可以创建一个包装结构有明确的东西吗?)。

下面的示例在 C 中编译并运行,但在 C++ 中失败。不幸的是,更完整的问题还有其他方面迫使 C++ 这样做。让它发挥作用的魔力是什么?

    #include <stdio.h>
    #include <stdint.h>
    struct __attribute__((__packed__)) vec {
      uint32_t addr;
      uint32_t len:24;
      uint8_t id;
    };
    struct vec first = { .addr=0xfeedface, .len=10, .id=5};
    volatile struct vec vvector;
    int main(int argc, char **argv, char **envp)
    {
      struct vec cvector;
      volatile struct vec *pvector = &vvector;
      *pvector = first;
      cvector = *pvector;
      printf("%x %d %d %d\n", cvector.addr, cvector.len, cvector.id, sizeof(cvector)); …
Run Code Online (Sandbox Code Playgroud)

c++ casting operator-overloading volatile

13
推荐指数
1
解决办法
839
查看次数

标签 统计

c++ ×1

casting ×1

operator-overloading ×1

volatile ×1