170 похожих чатов

Всем привет. Помогите разобраться с constexpr. Пишу прошивку для embeddedб

С++14 (больше не поддерживает компилятор :( ). У меня есть некий массив памяти, статически выделенный, и я хочу в нём разместить свои данные, зная размер всех данных. После этого я хочу на определенные поля этого массива заводить ссылки, и, чтобы эти ссылки можно было брать в compile-time.

struct Record {
void* data;
uint16_t size;
};

uint8_t mempool[200] = {0};

constexpr const Record db_data[] = {
{&(mempool[0]), 4},
{&(mempool[4]), 2},
};

template<int id>
constexpr const int& get_readonly_int()
{
return *static_cast<int*>(db_data[id].data);
}

constexpr const int& test_int = get_readonly_int<0>();

constexpr ругается, что static_cast из void* он не может сделать. если в последней строке constexpr убрать, то работает.

Как можно было бы обойти это ограничение? пытался делать
Record
::data указателем uint8_t* или union {uint8_t*, int*}, но всё это также не срабатывает.

6 ответов

20 просмотров

Ссылка в компайл-тайм — это просто переменная-ссылка (или указатель), инициализированная определённым адресом. Массив памяти — это экземпляр твоей структуры с данными, объявленный как глобальная переменная. Всё.

Тебе шаблоны не нужны. constexpr не нужен.

Нельзя реинтерпретировать произвольные байты в constexpr. Для этого в C++20 завезли std::bit_cast, а ранее - только страдать (или писать вручную через побитовые операции)

Sergey Pluzhnikov- Автор вопроса
Ilya Zviagin
Ссылка в компайл-тайм — это просто переменная-ссыл...

ну я выкинул лишнее, чтобы пример читабельным был. Конечно у меня сложнее применение. И шаблон там использую, чтобы static_assert использовать.

Sergey Pluzhnikov- Автор вопроса
Sergey Pluzhnikov
ну я выкинул лишнее, чтобы пример читабельным был....

А объясни, зачем тебе пыжиться и размещать твои структуры Record именно в uint8_t mempool[200] ? Почему бы просто не объявить массив твоих этих Record и успокоиться?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта