Opposite of C preprocessor “stringification”

有些话、适合烂在心里 提交于 2019-11-26 16:30:39

问题


When using C preprocessor one can stringify macro argument like this:

#define TO_STRING(x) "a string with " #x

and so when used, the result is as follows:

TO_STRING(test) will expand to: "a string with test"

Is there any way to do the opposite? Get a string literal as an input argument and produce a C identifier? For example:

TO_IDENTIFIER("some_identifier") would expand to: some_identifier

Thank you for your answers.

EDIT: For those wondering what do I need it for:

I wanted to refer to nodes in a scene graph of my 3D engine by string identifiers but at the same time avoid comparing strings in tight loops. So I figured I'll write a simple tool that will run in pre-build step of compilation and search for predefined string - for example ID("something"). Then for every such token it would calculate CRC32 of the string between the parenthesis and generate a header file with #defines containing those numerical identifiers. For example for the string "something" it would be:

#define __CRC32ID_something 0x09DA31FB

Then, generated header file would be included by each cpp file using ID(x) macros. The ID("something") would of course expand to __CRC32ID_something, so in effect what the compiler would see are simple integer identifiers instead of human friendly strings. Of course now I'll simply settle for ID(something) but I thought that using quotes would make more sense - a programmer who doesn't know how the ID macro works can think that something without quotes is a C identifier when in reality such identifier doesn't exist at all.


回答1:


No, you can't unstringify something.




回答2:


//unstringify test

enum fruits{apple,pear};

#define IF_WS_COMPARE_SET_ENUM(x) if(ws.compare(L#x)==0)f_ret=x;

fruits enum_from_string(wstring ws)
{
 fruits f_ret;
 IF_WS_COMPARE_SET_ENUM(apple)
 IF_WS_COMPARE_SET_ENUM(pear)
 return f_ret;
}

void main()
{
 fruits f;
 f=enum_from_string(L"apple");
 f=enum_from_string(L"pear");
}


来源:https://stackoverflow.com/questions/6982179/opposite-of-c-preprocessor-stringification

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!