reinterpret_cast <volatile uint8_t *> (37) 'не является константным выражением - PullRequest
0 голосов
/ 14 января 2019

gcc не может скомпилировать код ниже, в то время как clang компилируется нормально. У меня нет контроля над макросом PORTB, как в сторонней библиотеке (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;
}
...