【发布时间】:2021-09-06 20:54:08
【问题描述】:
我有这个旧的 C 代码,我的编译器警告我(旧的 C 风格转换)。
volatile uint32_t* map;
void** argForSomeAPIfunction = (void**)↦
如何将其转换为 C++ 演员表风格?我需要将 volatile uint32_t** 转换为 void**。
我需要这个的原因是有一个闭源供应商 API 期望我传递一个 void** 指针。我无法更改该函数签名。另一方面,供应商告诉我,我可以使用指向 uint32_t 的指针访问这个始终为 32 位的寄存器映射,他为我提供了 C 风格的工作示例,它使用了 (void**)&。我尝试了这个 C 示例,它工作正常。
旁注:此供应商 API 通过自定义内核模块与 PCIe 卡进行通信。有两种选择读取 PCIe 卡的内部存储器,使用使用“ioctl”和内置检查的安全 API 函数,或者使用对这个 32 位寄存器映射的无监督访问,通过调用 @ 来初始化987654323@。这仅在程序开始时执行一次。之后,我使用 map[offset] 直接访问内存,其中偏移量以 4 个字节为步长,而不是监督函数 API::ReadRegister(offset) 在某些情况下速度较慢并且严重延迟数据采集(而卡正在执行其他任务) )。计算机不会更改寄存器内容,它只是读取这些内容。外部独立卡可以随时更改寄存器内容,所以我相信厂商在示例中引入了关键字volatile。
【问题讨论】:
-
你正在做的是总是一个无效的演员和代码不正确。
-
我希望我能看到更多的上下文,因为这个
volatile uint32_t* map;闻起来不太好,第二行让它变得更糟。 -
@AnttiHaapala:如果您简要指出原因,我会得到帮助(OP 也是如此)
-
我现在添加了更多上下文。 C 代码来自供应商的示例,我试过了,它工作正常,结果与完全监督函数相同,但速度更快。
-
您的供应商似乎不称职。 “抛弃”
volatile始终是一个未定义的行为错误,进而可能导致生成不正确的机器代码。