C++ C++;宏代码-显式整数(任意大小)到指针类型的转换
问题: 我正在连接的AVR代码,有一个预先存在的宏到位C++ C++;宏代码-显式整数(任意大小)到指针类型的转换,c++,macros,casting,avr,C++,Macros,Casting,Avr,问题: 我正在连接的AVR代码,有一个预先存在的宏到位 #define pgm_read_float_near(address_short) foo 它用于将uint16\u t值作为指针,获取它,然后返回float值。我使用的是一个具有平坦地址空间的x86处理器,我只需要这个宏来遵从指针。我的目标是在取消引用之前,将uint16\u t转换为float* 当前解决方案: #define pgm_read_float_near(address_short) *reinterpret_cast&
#define pgm_read_float_near(address_short) foo
它用于将uint16\u t
值作为指针,获取它,然后返回float
值。我使用的是一个具有平坦地址空间的x86处理器,我只需要这个宏来遵从指针。我的目标是在取消引用之前,将uint16\u t
转换为float*
当前解决方案:
#define pgm_read_float_near(address_short) *reinterpret_cast<float *>(reinterpret_cast<void *>(NULL) | static_cast<uint16_t>(address_short))
#定义pgm_read_float_near(地址短)*重新解释转换(重新解释转换(空)|静态转换(地址短))
我想做的是
static\u cast
给定给宏的任何变量(不是类型
安全)作为一个uint16\u t,这是我期待的或
带有
“NULL
指针”,指向“干净地”将uint16\u t
展开到
uint32\u t
重新解释\u将或的结果转换回浮点*
float*
获取float
值#define pgm_read_float_near(address_short) *reinterpret_cast<float *>(reinterpret_cast<void *>(NULL) | static_cast<uint16_t>(address_short))
<强>注:在你说“宏是可怕的”之前,我没有选择,我在现有的框架中工作…
< P>因为你使用C++,我建议用C++模板:#include <stdio.h>
#include <stdint.h>
template<class Ty>
float *explicit_cast(Ty t) {
return 2;
}
template<>
float *explicit_cast<uint16_t>(uint16_t t) {
return reinterpret_cast<float *>(t);
}
#define pgm_read_float_near(address_short) explicit_cast(address_short)
void t8() {
uint8_t f8 = 2;
pgm_read_float_near(f8);
}
void t16() {
uint16_t f16 = 2;
pgm_read_float_near(f16);
}
void t32() {
uint32_t f32 = 2;
pgm_read_float_near(f32);
}
从其他类型转换将导致编译错误。原则是我们可以使用模板来区分uint16\u t和其他类型。如果您想要一个
uint32\u t
,为什么不将步骤1和2替换为静态转换为uint32\u t
?这正是我的问题所在。我害怕宏,因为它们不是类型化的,所以我试图避免意外的位。宏需要一个uint16\t,因此我试图确保它得到了预期的结果。这可能是必要的,也可能不是必要的,我不知道或者我不会问。是什么让你认为16位值在升级为32位指针类型时会指向任何有意义的位置?您是否正在编写x86“裸机”代码?如果没有,您如何确保您正在访问的浮点值
实际上存在于进程地址空间的前64kb内?@HannoBinder反馈非常好!(+1)正如我所说,我正在使用AVR代码,它就是这样设计的。我正在尝试将其移植到x86。你的关心和我的一样。这个SO问题的要点是尽可能“正确”地处理指针的翻译。接下来的步骤将需要对我正在移植的代码进行独立测试,看看这一策略是成功还是失败。谢谢你的仔细考虑,这就是我为什么要这么做的原因!顺便说一下,另一个建议是:uint8_t字节[];float*ptr=(float*)((void*)(&bytes[myInt])代码>我真的很喜欢你使用模板!我很好奇,当我使用static\u cast(address\u short)
时,上面的示例是否没有执行相同的类型检查?@Zakstatic\u cast
不检查源类型(无论是在编译时还是在运行时)。它只是一个模板。