【发布时间】:2021-05-23 10:18:23
【问题描述】:
在宏内部,我可以使用字符串化操作符#:
#define STRINGIZE(name) #name
cout << STRINGIZE(SomeClass) << endl; // Prints "SomeClass"
是否可以在宏中执行相反的操作,unstringize?怎么样?
例如:
#define RUN_FUNCTION(name) UNSTRINGIZE(name)();
void myFunction {
cout << "Hello!" << endl;
}
RUN_FUNCTION("myFunction") // Prints "Hello!"
如果不是,有什么原因吗?
【问题讨论】:
-
我很好奇您为什么要这样做,因为
"myFunction"需要是编译时字符串常量(预处理器可以访问的唯一类型的字符串)? -
我可以肯定这是做不到的。一个原因可能是没有人需要它。会有一些有趣的问题需要解决。
-
其实我不需要这个,我只是好奇。在阅读了 OP 想要从用户输入调用函数的问题后,我问自己是否有 unstringify 运算符
-
不,这是不可能的。它只会使预处理器更加复杂(在宏语言中引入两种类型,“随便什么”和“请只使用字符串”),而没有明显的需要。另外,取消字符串化并非易事(
UNSTRINGIZE("\x9f")是什么?) -
FWIW,我实际上几天前遇到了这个问题。一些整数数据被写成一个字符串,我想在编译时操作那个整数,所以我想去掉引号(代码库太大而不能简单地更改整数)。我已经知道这是不可能的,所以不要浪费时间。你们太沉迷于动机原因了;有时人们只是出于好奇而提问。
标签: c++