C++ C++;宏代码-显式整数(任意大小)到指针类型的转换

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&

问题: 我正在连接的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<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)
    时,上面的示例是否没有执行相同的类型检查?@Zak
    static\u cast
    不检查源类型(无论是在编译时还是在运行时)。它只是一个模板。