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

时间:2019-01-14 01:05:48

标签: c++ c++11 avr

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;
}

1 个答案:

答案 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;
}