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 ответов

19 просмотров

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

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

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

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

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

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

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта