В противоположность «строковой обработке» препроцессора C

При использовании препроцессора 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, хотя на самом деле такого идентификатора вообще не существует.

38
задан Brian Tompsett - 汤莱恩 27 March 2016 в 18:01
поделиться