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

时间:2014-08-20 21:48:56

标签: c++ macros casting avr

问题: 我正在连接到具有预先存在的宏的AVR代码......

#define pgm_read_float_near(address_short) foo

它用于将uint16_t值作为指针,获取它然后返回float值。我使用的是具有平坦地址空间的x86处理器,我只需要这个宏来指示指针。我的目标是在解除引用之前从uint16_tfloat *进行非常明确的演员。

当前解决方案:

#define pgm_read_float_near(address_short) *reinterpret_cast<float *>(reinterpret_cast<void *>(NULL) | static_cast<uint16_t>(address_short))

我正在尝试做什么..

  1. static_cast提供给宏的任何变量(不是类型 安全)作为uint16_t,我期待
  2. OR该值与 &#34; NULL指针&#34;,&#34;干净&#34;将uint16_t扩展为 uint32_t
  3. reinterpret_cast OR的结果返回float *
  4. 最后,尊重float *以获取float值。
  5. 问题:

    1. 我忘记了任何步骤吗?
    2. 我做了不必要的步骤,为什么?
    3. 注意:在你说之前,&#34;宏很可怕!&#34;我别无选择,我正在现有的框架中工作......

1 个答案:

答案 0 :(得分:1)

由于您使用的是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);
}

通过编译程序,您可以看到以下输出:

$ g++ cast.cpp -c
cast.cpp: In instantiation of ‘float* explicit_cast(Ty) [with Ty = unsigned char]’:
cast.cpp:18:5:   required from here
cast.cpp:6:12: error: invalid conversion from ‘int’ to ‘float*’ [-fpermissive]
cast.cpp: In instantiation of ‘float* explicit_cast(Ty) [with Ty = unsigned int]’:
cast.cpp:28:5:   required from here
cast.cpp:6:12: error: invalid conversion from ‘int’ to ‘float*’ [-fpermissive]

从其他类型转换会引入编译错误。原则是我们可以使用模板来区分uint16_t和其他类型。