В основном я хочу, чтобы в моем коде это было возможно:
Engine.getById(WSID('some-id'));
Который должен быть преобразован
Engine.getById('1a61bc96');
перед компиляцией в asm. Итак во время компиляции.
Это моя попытка
constexpr int WSID(const char* str) {
boost::crc_32_type result;
result.process_bytes(str,sizeof(str));
return result.checksum();
}
Но я получаю это при попытке скомпилировать с MSVC 18 (CTP November 2013)
error C3249: illegal statement or sub-expression for 'constexpr' function
Как я могу получить функцию WSID
, используя этот способ или любой, если это выполняется во время компиляции?
Пробовал это: Компилировать хэширование строки времени
warning C4592: 'crc32': 'constexpr' call evaluation failed; function will be called at run-time
EDIT:
Я впервые услышал об этой технике в Game Engine Architecture Джейсоном Грегори. Я связался с автором, который позаботился об этом мне:
Мы должны передать наш исходный код через пользовательский небольшой предварительный процессор, который ищет текст формы
SID('xxxxxx')
и преобразует все, что находится между одинарными кавычками в его хэшированный эквивалент как шестнадцатеричный литерал (0xNNNNNNNN
), [...]Возможно, вы могли бы сделать это с помощью макроса и/или метапрограммирования шаблонов тоже, хотя, как вы говорите, сложно сделать компилятор для такого рода работы для вас. Это не невозможно, но написать собственный инструмент проще и гораздо более гибким. [...]
Заметим также, что мы выбрали одиночные кавычки для
SID('xxxx')
литералов. Это было сделано для того, чтобы мы получили разумную подсветку синтаксиса в наших редакторах кода, но если что-то пошло не так, и какой-то непереработанный код когда-либо доводил его до компилятора, он бы выбросил синтаксическую ошибку, поскольку одинарные кавычки обычно зарезервированы для односимвольные литералы.Обратите также внимание на то, что важно, чтобы ваш небольшой инструмент предварительной обработки кэшировал строки в какой-либо базе данных, так что исходные строки можно искать с учетом хэш-кода. Когда вы отлаживаете свой код и вы проверяете переменную
StringId
, отладчик обычно показывает вам довольно непонятный хеш-код. Но с базой данных SID вы можете написать плагин, который преобразует эти хэш-коды обратно в их эквиваленты строк. Таким образом, вы увидите SID ('foo') в окне просмотра, а не0x75AE3080
[...]. Кроме того, игра должна иметь возможность загружать эту же базу данных, чтобы она могла печатать строки вместо шестнадцатеричных хеш-кодов на экране для целей отладки [...].
Но в то время как препроцесс имеет некоторые основные преимущества, это означает, что я должен подготовить какую-то систему вывода модифицированных файлов (они будут храниться в другом месте, а затем мы должны сообщить MSVC). Таким образом, это может усложнить задачу компиляции. Есть ли способ препроцессить файл с помощью python, например, без головных болей? Но это не вопрос, и меня все еще интересует использование функции времени компиляции (о кеше я мог бы использовать индекс ID)