如何获得当前功能的标识符

How can I obtain the identifier of the current function?

本文关键字:标识符 功能 何获得      更新时间:2023-10-16

在c/c 中,我们有__FUNCTION__宏,该宏被字符串替换,并保留当前函数的名称。但是,如果我想要该函数的标识符怎么办?也就是说,不是字符串,而是我可以用作创建其他标识符的令牌,例如,如果我们有

#define MAGIC /* ... */
#define MORE_MAGIC MAGIC ## _bar
void foo() {
    printf("%sn",__FUNCTION__);
    MORE_MAGIC();
}
void foo_bar() {
    printf("%sn",__FUNCTION__);
}
void baz() {
    printf("%sn",__FUNCTION__);
    MORE_MAGIC();
}
void baz_bar() {
    printf("%sn",__FUNCTION__);
}
int main() {
    foo();
}

应该打印

foo
foo_bar
baz
baz_bar

注意:

  • 我只对预处理时间感兴趣。
  • 我不想用预处理器调用来代替我的功能定义 - 尽管我知道这可能会起作用。

不幸的是你不能。因为您不能 undringify 宏[1]。

换句话说,您无法删除__FUNCTION__生成的字符串周围的引号,并通过_bar与其联系。

如果是您想要的编译时间,对于像您这样的简单情况,预处理器宏和串联操作员##可能是可能的。也许像

#define MORE_MAGIC(f) f##_bar
...
void foo_bar()
{
}
void foo()
{
    MORE_MAGIC(foo)();
}

不可能自动获取名称foo,必须在宏"呼叫"中明确命名。