C++ 如何获取当前函数的标识符?
在C/C++中,我们有一个C++ 如何获取当前函数的标识符?,c++,c,macros,c-preprocessor,C++,C,Macros,C Preprocessor,在C/C++中,我们有一个\uuuu FUNCTION\uuu宏,它被替换为一个字符串,保存当前函数的名称。但是如果我想要函数的标识符呢?也就是说,不是一个字符串,而是我可以用来作为标记来创建其他标识符的东西,例如,如果我们有 #define MAGIC /* ... */ #define MORE_MAGIC MAGIC ## _bar void foo() { printf("%s\n",__FUNCTION__); MORE_MAGIC(); } void foo_b
\uuuu FUNCTION\uuu
宏,它被替换为一个字符串,保存当前函数的名称。但是如果我想要函数的标识符呢?也就是说,不是一个字符串,而是我可以用来作为标记来创建其他标识符的东西,例如,如果我们有
#define MAGIC /* ... */
#define MORE_MAGIC MAGIC ## _bar
void foo() {
printf("%s\n",__FUNCTION__);
MORE_MAGIC();
}
void foo_bar() {
printf("%s\n",__FUNCTION__);
}
void baz() {
printf("%s\n",__FUNCTION__);
MORE_MAGIC();
}
void baz_bar() {
printf("%s\n",__FUNCTION__);
}
int main() {
foo();
}
应该打印
foo
foo_bar
baz
baz_bar
注意事项:
- 我只对预处理时间感兴趣
- 我不希望用预处理器调用替换我的函数定义——尽管我知道这可能会起作用
#
。也许像
#define MORE_MAGIC(f) f##_bar
...
void foo_bar()
{
}
void foo()
{
MORE_MAGIC(foo)();
}
虽然无法自动获取名称
foo
,但必须在宏“call”中显式命名它。不幸的是,您不能。因为无法解除宏[]的结构
换句话说,不能删除由<代码>、函数>、代码>生成的字符串的引用,并通过<代码> >栏>代码>联系。
C和C++没有,所以不可能。你可以在函数名和函数指针之间手工制作映射,但这是不可能实现自动化的。@JoachimPileborg:我相信OP是在问编译时魔法,而不是运行时魔法(即内省)。@JoachimPileborg我同意自动化一般来说是困难的,如果不是不可能的话,但是,根据@einpoklum对讨厌的宏的容忍度,对于特殊情况来说可能很容易。您可以定义扩展到函数原型的DEF_FUNC宏,以及函数在某种函数指针表中的注册。例如,DEF_FUNC(f)void f(){寄存器(f,_函数u)通常C/C++预处理器不做字符串操作,但是如果你有比“JoaHipIrBig”更复杂的情况,下面的EasyTI支持并愿意冒险进入奇怪的东西,有这样的事情:我必须问:为什么你认为你需要这个?我同意。在类似的情况下,我必须写一个C++包装器,I SImply编写了一个perl脚本,在编译时将foo.cpp.tmpl
处理成最终的foo.cpp
。是的,\uuuuuu函数\uuuuuu
是一个字符串文本,您对此无能为力。我并没有说我想取消函数的字符串化,我想知道编译器或预处理器是否提供我集成的功能直接在.cin EnPoCulu:我明白你的意思。标准C++中的一种可能性是不严格化<代码>函数>代码>这是不可能的。也许有一个编译器魔法来完成它,但是它不是标准的和可移植的方式。