В отличие от строкового преобразования препроцессора C

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


person MasterM    schedule 08.08.2011    source источник
comment
Из любопытства, чем это может быть полезно?   -  person Kerrek SB    schedule 08.08.2011
comment
Вы либо делаете что-то очень странное, либо делаете это совершенно неправильно. Опишите настоящую проблему.   -  person the_drow    schedule 08.08.2011
comment
Для этого вам понадобится интерпретатор C :)   -  person useraged    schedule 08.08.2011
comment
Для желающих добавлены пояснения. :)   -  person MasterM    schedule 09.08.2011
comment
Я много раз искал решение в Google, к сожалению, на данный момент решения нет, эта опция (destringify) очень полезна для написания факторизованных кодов c.   -  person elhadi dp ıpɐɥןǝ    schedule 14.03.2013
comment
Вот почему мы должны использовать PHP вместо препроцессора C. просто   -  person Dmitry    schedule 14.10.2016


Ответы (2)


Нет, вы не можете избавиться от чего-либо.

person Puppy    schedule 08.08.2011
comment
В более общем смысле препроцессор может соединять токены вместе, но не может разбивать токен на части. - person Keith Thompson; 08.08.2011

person    schedule
comment
@FDinoff: Лучше не надо. - person alecov; 25.06.2014
comment
это может сработать, только если вы подготовите свою базу данных из константных строк в enum_from_string(), иначе не: /, но интересно :) - person Aquarius Power; 02.06.2018