c - 这个表达式是如何求值的? (另外,那是什么?)

标签 c

我在微 Controller 附带的头文件中找到了这条语句,但不知道如何评估它

#define FIO0SET        (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18))

我完全不知道这个表达式是什么,所以我无法开始任何有意义的研究。谁能告诉我这只野兽是什么或如何评价它?

最佳答案

#define FIO0SET  (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18))

转到内存地址 FIO_BASE_ADDR + 0x18 并检索存储在该位置的 32 位(如果 unsigned long 是 32 位)字。 FIO0SET 也是一个可修改的左值,因此您可以为其分配一个值。

请注意,volatile 限定符用于通知编译器对象的值可以以未知的方式更改。考虑一个输入模式下的 IO 寄存器的例子:它的值可能会意外改变,编译器不能假设它的值在读取后没有改变。

例如:

unsigned long register_value;

register_value = FIO0SET; // store FIO0SET in register_value object

FIO0SET = 0x1122334;      // store 0x1122334 value in FIO0SET register 

关于c - 这个表达式是如何求值的? (另外,那是什么?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13054484/

相关文章:

c - 在 C 中将模板字符串中的\b 处理为 printf

c - C 函数返回反转字符串

c - 如何检查在 C 位域中设置的单个域

c - 为什么即使我没有返回对象,我的结构也会被清零?

c - 通过Cgo访问aerospike C客户端报错

c - 如何检测extern "C"生效

c - 半字节半数转换器

c - Windows 7 中的 rpcgen - 未找到预处理器

c - 绑定(bind)生命周期如何可以比对象生命周期长?

c - snprintf 中的 %c%.8x 格式意味着什么