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