@no111u3

С++11 как сделать чтобы вычисление адреса в указателе на структуру происходило во время компиляции?

Есть образец кода который успешно собирается на GCC вплоть до 6.1, но при этом не собирается на GCC 6.3 и не собирается на любой версии Clang.

constexpr int * const t = reinterpret_cast<int *>(0x40000);


template <int addr>
class C {
public:
  struct gpio_t {
    int test;
  };
  static constexpr volatile gpio_t * const regs =
    reinterpret_cast<volatile gpio_t *>(addr);
};

int main() {
  C<0x40000000>::regs->test = 5;
}


В ходе раскопок понял что это происходит от того что любые манипуляции с адресной арифметикой запрещены в самом стандарте, отсюда последовал вопрос, как не меняя эффективности и безопасности кода сделать так чтобы он соответствовал стандарту.
  • Вопрос задан
  • 452 просмотра
Пригласить эксперта
Ответы на вопрос 1
JBMurloc
@JBMurloc
Аспирант, инженер, физик, программист.
Если я правильно понял, то все эти извращения только для того, что бы работать с произвольным адресом в памяти, как с полем структуры. В связи с этим вопрос, почему просто не сделать так:

struct gpio_t {
    int test;
  };

#define TEST_1 reinterpret_cast<volatile gpio_t *> (0x12345678)

int main() {
TEST_1->test = 5;
}


По идее должно работать. Во всяком случае у меня такие фокусы срабатывали.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы