这个铸造是什么意思?
What does this casting mean?
这段代码是什么意思?
#define kb_Data \
(uint8_t)((volatile uint16_t*)0xF50010)
我理解 #define
语句的作用,但是当它把一个 uint16_t 指针转换为一个 uint8_t 整数时,这意味着什么?这意味着是一个字节数组,如 here 中所示,但我不明白 int 如何充当数组
作为一个完整的表达,这是胡说八道。我刚刚做了一些测试,默认情况下在 g++ 和 clang++ 上这是一个编译错误。在带有 -fpermissive 的 g++ 上,它编译并生成值 0x10.
但是宏不一定是完整的表达式,它们是文本替换。正如 Ben Voigt 在评论中指出的那样,这允许具有运算符优先级的恶作剧。
所以如果有人写了类似的东西。
a = kb_Data[2];
然后,由于数组索引的优先级高于 C 风格的转换,它将读取地址 0xf50010 处的 16 位数数组的元素 2。然后将结果转换为8位数字。
那你为什么要这样做?我最好的猜测是有人将 8 位外围设备连接到 16 位总线的低位,而不是实施适当的总线桥,然后使用宏 hack 使驱动程序工作。
这段代码是什么意思?
#define kb_Data \
(uint8_t)((volatile uint16_t*)0xF50010)
我理解 #define
语句的作用,但是当它把一个 uint16_t 指针转换为一个 uint8_t 整数时,这意味着什么?这意味着是一个字节数组,如 here 中所示,但我不明白 int 如何充当数组
作为一个完整的表达,这是胡说八道。我刚刚做了一些测试,默认情况下在 g++ 和 clang++ 上这是一个编译错误。在带有 -fpermissive 的 g++ 上,它编译并生成值 0x10.
但是宏不一定是完整的表达式,它们是文本替换。正如 Ben Voigt 在评论中指出的那样,这允许具有运算符优先级的恶作剧。
所以如果有人写了类似的东西。
a = kb_Data[2];
然后,由于数组索引的优先级高于 C 风格的转换,它将读取地址 0xf50010 处的 16 位数数组的元素 2。然后将结果转换为8位数字。
那你为什么要这样做?我最好的猜测是有人将 8 位外围设备连接到 16 位总线的低位,而不是实施适当的总线桥,然后使用宏 hack 使驱动程序工作。