抱歉,如果这很简单,我的 C++ 生锈了。
这是在做什么?据我所知,没有赋值或函数调用。这个代码模式在我继承的一些代码中重复了很多次。如果它很重要,那就是嵌入式代码。
*(volatile UINT16 *)&someVar->something;
编辑:从那里继续,以下附加代码是否证实了希思的怀疑? (完全来自代码,包括重复,除了名称已更改以保护无辜者)
if (!WaitForNotBusy(50))
return ERROR_CODE_X;
*(volatile UINT16 *)& someVar->something;
if (!WaitForNotBusy(50))
return ERROR_CODE_X;
*(volatile UINT16 *)& someVar->something;
x = SomeData;
最佳答案
这是在需要访问设备寄存器的嵌入式编程中相当常见的习惯用法(尽管它应该封装在一组函数或宏中)。在许多体系结构中,设备寄存器被映射到内存地址并像任何其他变量一样访问(尽管在固定地址 - 可以使用指针或者链接器或编译器扩展可以帮助固定地址)。但是,如果 C 编译器没有看到对变量访问的副作用,它可以优化它 - 除非变量(或用于访问变量的指针)被标记为 volatile 。
所以表达式;
*(volatile UINT16 *)&someVar->something;
将从存储在 someVar
指针中的地址的某个偏移量(由 something
结构元素的偏移量提供)发出 16 位读取。由于 volatile
关键字,此读取将发生并且无法被编译器优化掉。
请注意,一些设备寄存器执行一些功能,即使它们只是被读取——即使读取的数据没有被使用。这在状态寄存器中很常见,在读取指示特定位中的错误状态的寄存器后,可能会清除错误条件。
这可能是使用 volatile
关键字的更常见原因之一。
关于c++ - 有点奇怪的C++代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1792520/