问题: 我正在连接到具有预先存在的宏的AVR代码......
#define pgm_read_float_near(address_short) foo
它用于将uint16_t
值作为指针,获取它然后返回float
值。我使用的是具有平坦地址空间的x86处理器,我只需要这个宏来指示指针。我的目标是在解除引用之前从uint16_t
到float *
进行非常明确的演员。
当前解决方案:
#define pgm_read_float_near(address_short) *reinterpret_cast<float *>(reinterpret_cast<void *>(NULL) | static_cast<uint16_t>(address_short))
我正在尝试做什么..
static_cast
提供给宏的任何变量(不是类型
安全)作为uint16_t,我期待OR
该值与
&#34; NULL
指针&#34;,&#34;干净&#34;将uint16_t
扩展为
uint32_t
reinterpret_cast
OR
的结果返回float *
float *
以获取float
值。问题:
注意:在你说之前,&#34;宏很可怕!&#34;我别无选择,我正在现有的框架中工作......
答案 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和其他类型。