При использовании препроцессора C можно преобразовать аргумент макроса в строку следующим образом:
#define TO_STRING(x) "a string with " #x
и поэтому при использовании результат будет следующим: следует:
TO_STRING (test)
будет расширяться до: «строка с тестом»
Есть ли способ сделать обратное? Получить строковый литерал в качестве входного аргумента и создать идентификатор C ? Например:
TO_IDENTIFIER ("some_identifier")
расширится до: some_identifier
Спасибо за ваши ответы.
РЕДАКТИРОВАТЬ: Для тех, кто задается вопросом, для чего мне это нужно:
Я хотел ссылаться на узлы в графе сцены моего 3D-движка с помощью строковых идентификаторов, но в то же время избегать сравнения строк в тесных циклах. Поэтому я решил написать простой инструмент, который будет работать в предварительных сборках. tep компиляции и поиска предопределенной строки - например ID ("что-то")
. Затем для каждого такого токена он будет вычислять CRC32 строки между круглыми скобками и генерировать файл заголовка с #defines, содержащий эти числовые идентификаторы. Например, для строки «что-то»
это будет:
#define __CRC32ID_something 0x09DA31FB
Затем сгенерированный файл заголовка будет включен в каждый файл cpp с использованием ID (x)
макросы. ID («что-то»)
, конечно, будет расширяться до __ CRC32ID_something
, так что, по сути, компилятор увидит простые целочисленные идентификаторы вместо понятных для человека строк. Конечно, сейчас я просто соглашусь на ID (что-то)
, но я подумал, что использование кавычек будет иметь больше смысла - программист, который не знает, как работает макрос ID
, может думать что что-то
без кавычек является идентификатором C, хотя на самом деле такого идентификатора вообще не существует.