gcc无法编译下面的代码,而clang编译正常。我无法控制宏PORTB,因为它在 3rd 方库 ( avr) 中。
这是一个gcc错误吗?我怎样才能解决它gcc?作为一种解决方法,可以创建一个从 PORTB 中提取数值的预处理器宏?
请注意,这个问题与我之前的问题相似,但不完全相同。它也不同于这个问题,开发者可以灵活地改变赋值的 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;
}
Run Code Online (Sandbox Code Playgroud)
编译期间似乎reinterpret_cast不允许。因此,新版本的编译器更符合该语言。在需要reinterpret_casta 的情况下将不允许。constexpr
但也许这些解决方法可能会有所帮助(使用 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2101 次 |
| 最近记录: |