gcc
无法编译下面的代码,而clang
可以编译。我无法控制宏PORTB
,因为它在第三方库(avr
)中。
是gcc
个错误吗?如何在gcc
中解决该问题?作为一种解决方法,可以以某种方式创建一个预处理器宏,该宏从PORTB中提取数值吗?
请注意,这个问题与我之前的question类似,但并不相同。
它也不同于this这个问题,在该问题上,开发人员可以灵活地更改分配的rhs,从而避免使用reinterpret_cast
。
#include <iostream>
#include <cstdint>
#define PORTB (*(volatile uint8_t *)((0x05) + 0x20))
struct PortB {
static const uintptr_t port = reinterpret_cast<uintptr_t>(&PORTB);
};
int main() {
std::cout << PortB::port << "\n";
return 0;
}
答案 0 :(得分:1)
似乎reinterpret_cast
is not allowed during compilation。因此,编译器的较新版本就是more conforming to the language。需要reinterpret_cast
的地方将不允许使用constexpr
。
但也许这些解决方法可能会有所帮助(compiles with g++ 9.2):
#include <iostream>
#include <cstdint>
#define PORTB (*(volatile uint8_t *)((0x05) + 0x20))
struct PortB {
static uintptr_t port;
};
uintptr_t PortB::port = reinterpret_cast<uintptr_t>(&PORTB);
const uintptr_t freePort = reinterpret_cast<uintptr_t>(&PORTB);
#define macroPort reinterpret_cast<uintptr_t>(&PORTB)
int main() {
std::cout << PortB::port << "\n";
std::cout << freePort << "\n";
std::cout << macroPort << "\n";
return 0;
}