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