reinterpret_cast<volatile uint8_t*>(37)' 不是常量表达式

Fab*_*bio 8 c++ avr c++11

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)

use*_*993 1

编译期间似乎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)